Java 列表::包含比较器
是否有任何方法(方法、lambda或优雅构造)可以在基于给定比较器的列表中查找元素 我写了这样一个方法:Java 列表::包含比较器,java,lambda,java-8,Java,Lambda,Java 8,是否有任何方法(方法、lambda或优雅构造)可以在基于给定比较器的列表中查找元素 我写了这样一个方法: private static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) { return list.stream() .anyMatch(listItem -> comparator.compare(list
private static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
return list.stream()
.anyMatch(listItem -> comparator.compare(listItem, item) == 0
);
}
不确定这是否是您想要的,但一种可能性是创建您自己的接口扩展
流
,并提供您想要的方法(注意:未测试):
(但这是一大堆代码,实际上并不多)首先为什么要创建一个额外的函数?每次流运行时只需调用 如果您坚持,可以使用
BiPredicate
而不是比较器
比如说
BiPredicate<Integer,Integer> greaterThan = (i,s) -> i > s;
BiPredicate greaterThan=(i,s)->i>s;
并将contain函数更改为
private static <T> boolean containsp(List<T> list, T item, BiPredicate<? super T,? super T> biPredicate) {
return list.stream().filter(l-> biPredicate.test(l,item) ).findFirst().isPresent();
}
private static boolean containsp(List List,T item,BiPredicate据我所知,没有直接处理此任务的内置功能。因此,由于您无法避免创建实用工具方法(如果您希望减少代码重复),值得思考的是,哪种实用方法在其他场景中也会有用
例如,如果是我的项目,我知道几乎总是有一些方法用于部分功能应用,例如:
public static <T,U,R> Function<U,R> bind(BiFunction<T,U,R> f, T t) {
return u -> f.apply(t, u);
}
然后contains
方法变得非常简单
static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
return list.stream().anyMatch(bind(match(comparator), item));
}
静态布尔包含(列表、T项、比较器您可以使用以下方法:
IterableUtils.contains(IterableWell,你写的代码怎么不让你满意呢?看起来还不错(虽然在签名中我提供了一个comparator),我觉得可以通过巧妙地使用平台或语言来改进它。使用流和你自己的比较器几乎就是大多数人所说的“框架的智能使用”。这也是lambda最“漂亮”的方式。你还想要什么?@specialit这是个问题。根据经验,我认为可以进一步改进。我将用(不存在)的示例进行编辑我认为更好的/简单的方法。所有发布的代码段基本上都是你自己修改或扩展的版本。这意味着将流封装在这一点而不是仅仅调用该方法。我想去掉多余的代码,我想用更简单的方法替换它。我不想创建额外的函数。我宁愿摆脱它。.just uselist.stream().anyMatch(listItem->*并将表达式*放在这里)
。答案在哪里不符合您的需要。这个表达式在我的代码中的5个不同位置重复。我想要一些可重用的东西,这就是为什么我有这个方法。我实际上并不坚持这个方法,我想标准Java API会有一个更简单的方法。
private static <T> boolean containsp(List<T> list, T item, BiPredicate<? super T,? super T> biPredicate) {
return list.stream().filter(l-> biPredicate.test(l,item) ).findFirst().isPresent();
}
public static <T,U,R> Function<U,R> bind(BiFunction<T,U,R> f, T t) {
return u -> f.apply(t, u);
}
static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
return list.stream().map(bind(comparator::compare, item))
.anyMatch(Predicate.isEqual(0));
}
public static <T> BiPredicate<T,T> match(Comparator<T> f) {
return (a,b)->f.compare(a, b)==0;
}
public static <T,U> Predicate<U> bind(BiPredicate<T,U> f, T t) {
return u -> f.test(t, u);
}
static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
return list.stream().anyMatch(bind(match(comparator), item));
}