【问题标题】:Java streams groupingBy with condition [duplicate]Java流groupingBy条件[重复]
【发布时间】:2020-07-21 11:05:50
【问题描述】:

如何按一系列可能的值对列表进行分组? 如果我有一个班级 Foo

class Foo{
   int value;
}

然后列出 foos List<Foo> 列表

list.stream().collect(Collectors.groupingBy(Foo::getValue));
            

将我的具有相同价值的 foos 收集到一组中。但我想将一系列值分组到一个组中。例如

values < 5 in group "A"
values > 5 && < 25 in group "B"
values >= 25  in group "C"

或者另一个例子:假设我有一个整数列表:

List<Integer> list = List.of(2,3,4,9,11,17,28,29,32);
list.stream().collect(Collectors.groupingBy(
            classifier, 
            Collectors.toList()));

我试图把类似的东西放到分类器中

 i < 5 ? "A": i >= 5 && i < 25 ? "B" : "C";

这会导致编译错误。怎么做?

【问题讨论】:

  • Collectors.groupingBy(i -&gt; i &lt; 5 ? "A" : i &lt; 25 ? "B" : "C") 对我来说很好,你能显示编译错误发生在哪里吗? -> 你忘记使用 lambda 了吗?
  • @Lino-Votedon'tsay 谢谢我的错误。我忘记输入i -&gt;。非常感谢。

标签: java java-stream grouping


【解决方案1】:

代替Foo::getValue,提供一个函数来给出它所属的组:

public class B {
    public static String group(int integer) {
        if (i < 5) {
             return "A";
        } else if (i < 25) {
            return "B";
        }
        return "C";
    }
}

然后:

list.stream().collect(Collectors.groupingBy(B::group));

【讨论】:

    【解决方案2】:

    确保在您的分类器中返回值。

    这应该适用于您上面的示例:

    List<Integer> list = Arrays.asList(2,3,4,9,11,17,28,29,32);
    list.stream().collect(Collectors.groupingBy(i -> {
        if (i < 5) return "a";
        else if (i < 25) return "b";
        return "c";
      }, Collectors.toList()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2022-11-21
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多