java 同时使用多个流,具有多个属性的Java流

I have following objects in the stream:

class Foo{

String a;

String b;

int c;

}

I would like to filter a stream based on following criteria:

eg. Having entries in stream: foo1 and foo2:

foo1 and foo2 have same values for a and b, but they differ in c property.

I would like to get rid of entries that have c higher in such case.

解决方案

Semantically equivalent to Eugene’s answer, but a bit simpler:

List foos = Stream.of(new Foo("a", "b", 1), new Foo("a", "b", 2),

new Foo("a", "b", 3), new Foo("a", "bb", 3), new Foo("aa", "b", 3))

.collect(Collectors.collectingAndThen(

Collectors.toMap(x -> Arrays.asList(x.getA(), x.getB()), x -> x,

BinaryOperator.minBy(Comparator.comparing(Foo::getC))),

map -> new ArrayList<>(map.values())));

You need to group by a key holding both properties and due to the absence of a standard Pair type, you may use a List with two elements or a Map.Entry, both work. But using List is simpler (in Java 9, you would use List.of(…, …) which is even simpler) and has a better hash code if the same values may occur in both properties.

When the dowstream operation is a pure reduction, like selecting the minimum of the C property, the toMap collector fits better as it doesn’t require dealing with Optional.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值