java - 列表::包含比较器

标签 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(listItem, item) == 0
            );
}

但我希望用更优雅的东西替换它。

我不想添加任何依赖项,所以没有 Guava、“commons”等。我真的在寻找一种在 Java 8 中执行此操作的漂亮方法。

编辑:一些我认为更优雅的例子(这里是使用代码):

// sadly, this method doesn't exist
// nor is there a static one in Collections
// but maybe you can think of another way?
if (list.containsSame(item, comparator)) {
    // ...
}

最佳答案

据我所知,没有直接解决此任务的内置功能。因此,由于您无法避免创建实用方法(如果您想减少代码重复),因此值得考虑哪种实用方法在其他场景中也很有用。

例如如果这是我的项目,我知道几乎总是有用于部分函数应用程序的方法,例如:

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));
}

但这不一定是最好的解决方案。

另一种方法可能是使用一个方法将 Comparator 转换为等式 BiPredicate 和一个用于部分应用 BiPredicate 的实用方法:

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);
}

那么contains方法就变得很简单了

static <T> boolean contains(List<T> list, T item, Comparator<? super T> comparator) {
  return list.stream().anyMatch(bind(match(comparator), item));
}

但这只是一种简化,前提是实用方法也可以在项目的其他地方使用。另一方面,它们具有如此普遍的性质,以至于类似的方法可能会作为 default 方法添加到后续 Java 版本中的函数接口(interface)中。在这种情况下,您使用此类实用方法的代码已准备好迁移到该较新版本。

关于java - 列表::包含比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27269675/

相关文章:

c# - C# 在 foreach 中重用变量是否有原因?

python - 如何在一次传递的 Spark 中添加元组列表中第二个元素的长度?

javascript - BIRT 在脚本中将 HTML 文本转换为纯文本

java - 将 onclick 监听器添加到 fragment 的 xml 中的按钮

java - 将 h2 数据库实现到现有的 spring-boot 应用程序

Haskell Lambda 帮助 - 创建应用程序函数

java - 如何使用 Java8 流从嵌套对象组装 Map<Key, Value>?

java - 通过 map 流进行过滤并收集到单个列表中?

java - 如何检查变量是否存在于sql表中,如果不存在则条件并将其插入到anylogic中的表中

c# - 在c#中有没有类似java的Character.digit(char ch, int radix)的东西?