具有过滤条件工作流程的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)); }; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |