Java 列表::包含比较器

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

是否有任何方法(方法、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
            );
}

不确定这是否是您想要的,但一种可能性是创建您自己的接口扩展
,并提供您想要的方法(注意:未测试):


(但这是一大堆代码,实际上并不多)

首先为什么要创建一个额外的函数?每次流运行时只需调用

如果您坚持,可以使用
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 use
    list.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));
    }