如何使用流来实现以下代码片段显示的内容?基本上,我需要根据条件终止循环返回一个值,或者根据条件再次返回另一个值.
enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY } class MyObj { Day d; public Day getDay(); } ListmyObjList; Day Myfunc () { // If atleast one obj belongs to SUNDAY or MONDAY, return. Day myDay = null; for(MyObj myObj : myObjList) { if(myObj.getDay() == Day.SUNDAY || myObj.getDay() == Day.MONDAY) { return myObj.getDay(); } else if (myObj.getDay() == Day.TUESDAY) { myDay = myObj.getDay(); } } return myDay; }
Tagir Valeev.. 5
我理解你的函数的逻辑如下:
如果输入中有SUNDAY或MONDAY,则返回其中的第一个.
否则,如果有星期二,请将其退回.
否则返回null.
您可以在Java-8样式中实现此逻辑,迭代列表两次并使用Optional.orElseGet
:
myObjList.stream().map(MyObj::getDay).filter(d -> d == Day.SUNDAY || d == Day.MONDAY) .findFirst() .orElseGet(() -> myObjList .stream().map(MyObj::getDay).anyMatch(d -> d == Day.TUESDAY) ? Day.TUESDAY : null);
看起来有点难看,所以最好坚持原始的命令式代码.
另一种一次性解决方案是引入日期优先级并使用它:
int priority(Day d) { switch(d) { case SUNDAY: case MONDAY: return 10; // max priority case TUESDAY: return 5; default: return 0; } }
现在你可以使用Stream.max
:
return myObjList.stream().map(MyObj::getDay).max(Comparator.comparingInt(this::priority)) .filter(day -> priority(day) > 0).orElse(null);
虽然它比原始代码更长,但这种解决方案看起来更灵活:您可以轻松添加更多调整priority
方法的案例.
我理解你的函数的逻辑如下:
如果输入中有SUNDAY或MONDAY,则返回其中的第一个.
否则,如果有星期二,请将其退回.
否则返回null.
您可以在Java-8样式中实现此逻辑,迭代列表两次并使用Optional.orElseGet
:
myObjList.stream().map(MyObj::getDay).filter(d -> d == Day.SUNDAY || d == Day.MONDAY) .findFirst() .orElseGet(() -> myObjList .stream().map(MyObj::getDay).anyMatch(d -> d == Day.TUESDAY) ? Day.TUESDAY : null);
看起来有点难看,所以最好坚持原始的命令式代码.
另一种一次性解决方案是引入日期优先级并使用它:
int priority(Day d) { switch(d) { case SUNDAY: case MONDAY: return 10; // max priority case TUESDAY: return 5; default: return 0; } }
现在你可以使用Stream.max
:
return myObjList.stream().map(MyObj::getDay).max(Comparator.comparingInt(this::priority)) .filter(day -> priority(day) > 0).orElse(null);
虽然它比原始代码更长,但这种解决方案看起来更灵活:您可以轻松添加更多调整priority
方法的案例.