天道酬勤,学无止境

java-stream

How to make a Predicate from a custom list of Predicates in Java?

问题 public class Tester { private static ArrayList<Predicate<String>> testerList; //some Predicates of type String here... public static void addPredicate(Predicate<String> newPredicate) { if (testerList == null) {testerList = new ArrayList<Predicate<String>>();} testerList.add(newPredicate); } public static Predicate<String> customTesters () { return s -> testerList.stream().allMatch(t -> t.test(s)); } } 回答1 你可以有一个静态方法来接收许多谓词并返回你想要的谓词: public static <T> Predicate<T> and(Predicate<T>... predicates) { // TODO Handle case when argument is null or empty or has only one element return s -> Arrays

2022-05-17 02:32:09    分类:技术分享    java   lambda   java-8   java-stream   predicate

Get index of element that matches a predicate

问题 我知道如何通过谓词查找列表的第一个元素:Find first element by predicate 有没有一种简单的方法来获取该元素的索引? 回答1 IntStream.range(0, yourList.size()) .filter(i -> yourList.get(i)... your filter condition) .collect(Collectors.toList());

2022-05-16 18:48:08    分类:技术分享    java   collections   java-stream

Java 8 stream's toArray and size parameter

问题 我想知道 stream().toArray[x -> new Integer[x]] 如何知道数组的大小? 我写了一个片段,在其中我创建了一个大小为 4 的整数列表并过滤了值,它创建了一个过滤流长度的数组,我在流上看不到任何方法来获取流的大小。 List<Integer> intList = new ArrayList<Integer>(); intList.add(1); intList.add(2); intList.add(3); intList.add(4); Integer[] array = intList.stream() .filter(x -> x > 2) .toArray(x -> { System.out.println("x --> " + x); return new Integer[x]; }); System.out.println("array length: " + array.length); 上述代码的输出: x --> 2 array length: 2 最初,片段就像 Integer[] array = intList.stream() .filter(x -> x > 2) .toArray(x -> new Integer[x]); 只是为了了解它传递的 x 的值,我必须将其更改为在 lambda 中打印 x 回答1 回答2

2022-05-16 03:28:39    分类:技术分享    java   lambda   java-8   java-stream

Java 8 Streams map API - interpretation of method reference

问题 示例代码: class Outer { public Integer i; Outer(Integer i) { this.i = i; } public int getVal() { return i; } } class MyClass { public Integer f(Outer o) { return o.getVal();}; public void main() { MyClass g = new MyClass(); List<Integer> l1 = Arrays.asList(new Outer(2)).stream().map(g::f).collect(Collectors.toList()); List<Integer> l2 = Arrays.asList(new Outer(2)).stream().map(Outer::getVal).collect(Collectors.toList()); } } 使用任一方法参考 Outer::instanceMethod不带参数,基本上是一个Supplier<T>功能接口。 [1] MyClass::instanceMethod接受类型为Outer的参数并且是Function<T,R>功能接口。 [1] 已验证。 那么map函数如何知道将选项(1)中的函数应用于流的对象,但将流对象传递给选项(2

2022-05-15 20:03:25    分类:技术分享    java   java-8   java-stream

Nested forEach in Java 8

问题 我想根据 Java 8 的流重写这段代码 for (Medium medium : sortierteMedien) { System.out.println("Fuenf aehnlichste Medien fuer " + medium.getClass() + " mit dem Titel " + medium.getTitel() + ":\n"); for (Medium medium1 : bibliothek.medienSim(medium)) { System.out.println(medium1.toString()); } System.out.println(); } 这里的困难在于,在每个内部for循环之前和之后都有一个print语句。 是否可以用流重写它? 回答1 循环中的命令式语句不是 Stream API 使用的典型任务。 你仍然可以在没有 Stream API 的情况下使用 lambda 表达式来做到这一点,即 sortierteMedien.forEach(medium -> { System.out.println("Fuenf aehnlichste Medien fuer " +medium.getClass()+" mit dem Titel "+medium.getTitel()+":\n"); bibliothek

2022-05-15 16:05:08    分类:技术分享    java   lambda   java-8   java-stream

Java 8 List<T> into Map<T, (index)> [duplicate]

问题 这个问题在这里已经有了答案: 在 Java 8 中是否有一种简洁的方法来迭代带有索引的流? (23 个回答) 5年前关闭。 是否有一种方便的 Java8 流 API 方法可以将List<T>转换to Map<T, (index)> ,如下例所示: List<Character> charList = "ABCDE".chars().mapToObj(e->(char)e).collect(Collectors.toList()); Map<Character, Integer> map = new HashMap<>(); for (int i = 0; i < charList.size(); i++) { map.put(charList.get(i), i); } 地图 = {A=0, B=1, C=2, D=3, E=4} 回答1 您可以使用以下讨厌的技巧,但它并不优雅,而且在链表上根本没有效率: List<String> list = Arrays.asList("a", "b", "c"); Map<String, Integer> result = IntStream.range(0, list.size()) .boxed() .collect(Collectors.toMap(list::get, Function.identity())); 它也比简单的

2022-05-15 10:52:08    分类:技术分享    java   lambda   java-8   java-stream

What does the Java 8 Collector UNORDERED characteristic mean?

问题 在官方文档中,您可以阅读: UNORDERED表示收集操作不承诺保留输入元素的遇到顺序。 没有任何示例,这并没有太大帮助。 我的问题是, UNORDERED特征到底是什么意思? 我应该将它与 min 或 sum 等减少收集器一起使用,还是仅适用于收集收集器? 在 OpenJDK 中,减少操作(min、sum、avg)看起来像空的特性。 我希望至少能找到CONCURRENT和UNORDERED 。 回答1 在没有特殊请求的情况下,流操作必须表现得好像元素是按照源的遭遇顺序处理的。 对于某些操作(例如使用关联操作进行归约),可以遵守此约束并仍然获得有效的并行执行。 但是,对于其他人来说,这种约束是非常有限的。 而且,对于某些问题,此约束对用户没有意义。 考虑以下流管道: people.stream() .collect(groupingBy(Person::getLastName, mapping(Person::getFirstName)); 与“Smith”相关的名字列表按照它们在初始流中出现的顺序出现在地图中是否重要? 对于一些问题,是的,对于一些不是——我们不希望流库为我们猜测。 一个无序收集器说,可以按照与史密斯姓氏在输入源中出现的顺序不一致的顺序将名字插入到列表中。 通过放松这个约束,有时(不总是),流库可以提供更有效的执行。 例如,如果您不关心此订单保留

2022-05-15 08:23:04    分类:技术分享    java   java-8   java-stream   collectors

Populate a map conditionally using streams - Java 8

问题 我正在尝试翻译这个(简化的)代码以使用 Java-8 流: Map<String, String> files = new ConcurrentHashMap<String, String>(); while(((line = reader.readLine()) != null) { if(content != null) files.put("not null"+line, "not null"+line); else files.put("its null"+line, "its null"+line); } reader.close(); 这是我尝试过的: files = reader.lines().parallel().collect((content != null)? (Collectors.toConcurrentMap(line->"notnull"+line, line->line+"notnull")) : (Collectors.toConcurrentMap(line->line+"null", line->line+"null"))); 但是上面给出了 intelliJ 上所有line->line+"..."的“循环推理”消息。 什么是循环推理? 这个逻辑有错误吗? 我在 SO 上注意到了一些类似的问题。 但他们建议使用 interface

2022-05-13 09:48:07    分类:技术分享    java   intellij-idea   lambda   java-8   java-stream

Implementation of having count with group by in java 8

问题 我正在寻找 group by 的实现,然后根据 lambda 表达式中的计数进行过滤。 select COUNT(employee_id), department_id from employee GROUP BY department_id HAVING COUNT(employee_id) > 1 是否有任何使用 lambda 表达式实现此目的的简单实现。 回答1 您可以将groupingBy收集器与counting()和collectingAndThen结合起来: import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.counting; import static java.util.stream.Collectors.groupingBy; ... Map<Long, Long> map = employees.stream() .collect(collectingAndThen(groupingBy(Employee::getDeptId, counting()), m -> { m.values().removeIf(v -> v <= 1L); return m; })); 请注意

2022-05-13 09:42:10    分类:技术分享    java   lambda   java-8   java-stream

Special behavior of a stream if there are no elements

问题 如何用 java8 流式 API 表达这一点? 我想为流的每个项目执行itemConsumer 。 如果没有我想执行的项目emptyAction 。 当然我也可以这样写: Consumer<Object> itemConsumer = System.out::println; Runnable emptyAction = () -> {System.out.println("no elements");}; Stream<Object> stream = Stream.of("a","b"); // or Stream.empty() List<Object> list = stream.collect(Collectors.toList()); if (list.isEmpty()) emptyAction.run(); else list.stream().forEach(itemConsumer); 但我宁愿避免使用任何List 。 我还考虑过在peek方法中设置一个标志——但该标志不是最终的,因此是不允许的。 使用布尔容器似乎也是一种解决方法。 回答1 你可以强制reduce这样做。 逻辑是减少false ,如果遇到任何有用的数据,将值设置为true 。 然后reduce的结果为false ,然后没有遇到任何项目。 如果遇到任何项目,则结果将为true :

2022-05-13 02:50:09    分类:技术分享    java   java-stream