首页 > 编程语言> > Java 8流:简化流中的o1-> Objects.equals(o1.getSome().getSomeOther(),o2.getSome().getSomeOther())
Java 8流:简化流中的o1-> Objects.equals(o1.getSome().getSomeOther(),o2.getSome().getSomeOther())
作者:互联网
给出以下代码:
stream.filter(o1 -> Objects.equals(o1.getSome().getSomeOther(),
o2.getSome().getSomeOther())
如何将其简化?
是否有一些equals-utility可以让您首先提取密钥,就像有Comparator.comparing
接受密钥提取器功能一样?
请注意,代码本身(getSome().getSomeOther())实际上是从模式生成的.
解决方法:
编辑:(与同事讨论后再访问:Is there a convenience method to create a Predicate that tests if a field equals a given value?)
现在,我们来到了以下可重用的功能接口:
@FunctionalInterface
public interface Property<T, P> {
P extract(T object);
default Predicate<T> like(T example) {
Predicate<P> equality = Predicate.isEqual(extract(example));
return (value) -> equality.test(extract(value));
}
}
以及以下静态便利方法:
static <T, P> Property<T, P> property(Property<T, P> property) {
return property;
}
过滤现在看起来像:
stream.filter(property(t -> t.getSome().getSomeOther()).like(o2))
与以前的解决方案相比,我喜欢这种解决方案的地方:它清楚地将属性的提取与谓词本身的创建分开,并且更清楚地说明了正在发生的事情.
先前的解决方案:
<T, U> Predicate<T> isEqual(T other, Function<T, U> keyExtractFunction) {
U otherKey = keyExtractFunction.apply(other);
return t -> Objects.equals(keyExtractFunction.apply(t), otherKey);
}
这导致以下用法:
stream.filter(isEqual(o2, t -> t.getSome().getSomeOther())
但是如果有人有更好的解决方案,我会感到非常高兴.
标签:java-8,java-stream,java 来源: https://codeday.me/bug/20191111/2019835.html