作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定以下代码:
stream.filter(o1 -> Objects.equals(o1.getSome().getSomeOther(),
o2.getSome().getSomeOther())
这怎么可能被简化?
是否有一些equals
-实用程序可以让您首先提取一个 key ,就像Comparator.comparing
一样哪个接受 key 提取器函数?
请注意,代码本身 (getSome().getSomeOther()
) 实际上是从模式生成的。
最佳答案
编辑:(在与同事讨论并重新访问后:Is there a convenience method to create a Predicate that tests if a field equals a given value?)
我们现在得到以下可重用的功能接口(interface):
@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))
与之前的解决方案相比,我喜欢这个解决方案的地方:它清楚地将属性的提取和 Predicate
本身的创建分开,并且更清楚地说明了正在发生的事情。
以前的解决方案:
<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 Streams : simplifying o1 -> Objects. equals(o1.getSome().getSomeOther(), o2.getSome().getSomeOther()) 在流中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43661288/
给定以下代码: stream.filter(o1 -> Objects.equals(o1.getSome().getSomeOther(),
我是一名优秀的程序员,十分优秀!