加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

具有过滤条件工作流程的Java 8流

发布时间:2020-12-15 02:01:05 所属栏目:Java 来源:网络整理
导读:在具有过滤条件的 Java 8流中,集合中的每个元素都将传递给过滤器以检查条件.在这里,我将编写两种不同的过滤条件并提供不同的工作流程. public static void main(String[] args) { ListString asList = Arrays.asList("a","b","c","d","e","a","c"); //line 1
在具有过滤条件的 Java 8流中,集合中的每个元素都将传递给过滤器以检查条件.在这里,我将编写两种不同的过滤条件并提供不同的工作流程.

public static void main(String[] args) {

    List<String> asList = Arrays.asList("a","b","c","d","e","a","c");

    //line 1
    asList.stream().map(s -> s).filter(distinctByKey(String::toString)).forEach(System.out::println);

    Predicate<String> strPredicate = (a) -> {
        System.out.println("inside strPredicate method--");
        return a.startsWith("a");
    };

    //line 2
    asList.stream().filter(strPredicate).forEach(System.out::println);
}

public static <T> Predicate<T> distinctByKey(Function<? super T,?> keyExtractor) {
    System.out.println("inside distinctByKey method...");
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

在上面的示例代码中,语句行1过滤条件仅执行一次,但第2行正在为集合输出中的每个元素执行.

我认为distinctByKey方法将对集合中的每个元素执行,但事实并非如此.为什么?

看到的Set对象引用变量也只执行一次?流程如何工作?

解决方法

distinctByKey是一个lambda工厂方法.它返回一个Predictate< T>.

因此,当您执行:filter(distinctByKey(String :: toString))时,您实际上首先调用distinctByKey方法,然后返回Predicate.然后为每个元素执行该谓词.工厂功能只会执行一次.

在返回的lambda中移动System.out.println时,您将获得所需的print语句:

public static <T> Predicate<T> distinctByKey(Function<? super T,?> keyExtractor) {
    System.out.println("inside distinctByKey method...");
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> {
        System.out.println("inside distinctByKey.lambda method... ");
        return seen.add(keyExtractor.apply(t));
    };
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读