当前位置:  开发笔记 > 编程语言 > 正文

如何使用流有条件地终止循环收集

如何解决《如何使用流有条件地终止循环收集》经验,为你挑选了1个好方法。

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

enum Day {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY
} 

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

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

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方法的案例.



1> Tagir Valeev..:

我理解你的函数的逻辑如下:

    如果输入中有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方法的案例.


@singhakash,代码不返回原始列表元素(`MyObj`类型),而是返回`Day`枚举值.再看一遍.
推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有