gpt4 book ai didi

java - 如何使用流有条件地终止集合循环

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:57 25 4
gpt4 key购买 nike

如何使用流来实现类似于以下代码片段所示的内容?基本上,我需要终止一个循环,根据条件返回一个值,或者根据条件再次返回另一个值。

enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY
}

class MyObj {
Day d;
public Day getDay();
}

List<MyObj> myObjList;

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;
}

最佳答案

我理解你的功能逻辑如下:

  1. 如果输入中有 SUNDAY 或 MONDAY,则返回其中的第一个。
  2. 否则如果有星期二,返回它。
  3. 否则返回null。

您可以使用 Optional.orElseGet 以 Java-8 样式迭代列表两次来实现此逻辑:

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 方法轻松添加更多案例。

关于java - 如何使用流有条件地终止集合循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com