Tag: java stream

flatMap是否保证是懒惰的?

请考虑以下代码: urls.stream() .flatMap(url -> fetchDataFromInternet(url).stream()) .filter(…) .findFirst() .get(); 当第一个url足够时, fetchDataFromInternet会为第二个url调用fetchDataFromInternet ? 我尝试了一个较小的例子,它看起来像预期的那样工作。 即逐个处理数据但是可以依赖这种行为吗? 如果没有,在.flatMap(…)之前调用.sequential() .flatMap(…)帮助吗? Stream.of(“one”, “two”, “three”) .flatMap(num -> { System.out.println(“Processing ” + num); // return FetchFromInternetForNum(num).data().stream(); return Stream.of(num); }) .peek(num -> System.out.println(“Peek before filter: “+ num)) .filter(num -> num.length() > 0) .peek(num -> System.out.println(“Peek after filter: “+ num)) .forEach(num -> { System.out.println(“Done ” […]

Java Streams:如何做一个有效的“独特和排序”?

让我们假设我有一个Stream并希望只获得不同的元素并进行排序。 天真的做法是做到以下几点: Stream.of(…) .sorted() .distinct() 或者,也许相反: Stream.of(…) .distinct() .sorted() 由于JDK的源代码无法实现这两者的实现,我只是想知道可能的内存消耗和性能影响。 或者,如下所示编写我自己的filter会更高效吗? Stream.of(…) .sorted() .filter(noAdjacentDuplicatesFilter()) public static Predicate noAdjacentDuplicatesFilter() { final Object[] previousValue = {new Object()}; return value -> { final boolean takeValue = !Objects.equals(previousValue[0], value); previousValue[0] = value; return takeValue; }; }

如何实现Java流?

我想实现Stream 。 我不想只使用implements Stream ,因为我必须实现大量的方法。 这可以避免吗? 更具体一点,我如何流t1 , t2和t3 ,例如: class Foo { T t1, t2, t3; Foo(T t1, T t2, T t3) { this.t1 = t1; this.t2 = t2; this.t3 = t3; } }

在管道中间关闭流

当我执行此代码时,它会在流管道中打开大量文件: public static void main(String[] args) throws IOException { Files.find(Paths.get(“JAVA_DOCS_DIR/docs/api/”), 100, (path, attr) -> path.toString().endsWith(“.html”)) .map(file -> runtimizeException(() -> Files.lines(file, StandardCharsets.ISO_8859_1))) .map(Stream::count) .forEachOrdered(System.out::println); } 我得到一个例外: java.nio.file.FileSystemException: /long/file/name: Too many open files 问题是当Stream.count完成后, Stream.count不会关闭流。 但我不明白为什么它不应该,因为它是一个终端操作。 对于其他终端操作(例如reduce和forEach 。 另一方面, flatMap关闭它所包含的流。 该文档告诉我使用try-with-resouces语句在必要时关闭流。 在我的情况下,我可以用这样的东西替换count行: .map(s -> { long c = s.count(); s.close(); return c; } ) 但这是嘈杂和丑陋的,在某些情况下可能会给大型复杂的管道带来真正的不便。 所以我的问题如下: 为什么流设计不是为了让终端操作关闭他们正在处理的流? […]

是否不鼓励在Java EE容器中使用Java 8并行流?

鉴于不鼓励在Java EE容器中生成线程 。 在Java EE中使用Java 8并行流可能会产生线程吗?

使用java8流创建另一个对象列表

我正在尝试理解Java 8流。 我有两节课: public class UserMeal { protected final LocalDateTime dateTime; protected final String description; protected final int calories; public UserMeal(LocalDateTime dateTime, String description, int calories) { this.dateTime = dateTime; this.description = description; this.calories = calories; } public LocalDateTime getDateTime() { return dateTime; } public String getDescription() { return description; } public int getCalories() { […]

通过鉴别器function对流进行分区

Streams API中缺少的function之一是“分区依据”转换,例如Clojure中定义的。 假设我想重现Hibernate的fetch join :我想发出一个SQL SELECT语句来从结果中接收这种对象: class Family { String surname; List members; } 我发出: SELECT f.name, m.name FROM Family f JOIN Member m on m.family_id = f.id ORDER BY f.name 我检索(f.name, m.name)记录的(f.name, m.name) 。 现在我需要将它转换为Family对象流,并在其中包含其成员列表。 假设我已经有一个Stream ; 现在我需要将其转换为Stream<List> ,然后使用映射转换对其进行操作,将其转换为Stream 。 转换的语义如下:只要提供的鉴别器函数保持返回相同的值,就继续将流收集到List中; 一旦值更改,将List作为输出流的元素发出并开始收集新的List 。 我希望能够编写这种代码(我已经有了resultStream方法): Stream dbStream = resultStream(queryBuilder.createQuery( “SELECT f.name, m.name” + ” FROM […]

来自HashSet的并行流不会并行运行

我有要并行处理的元素集合。 当我使用List ,并行性有效。 但是,当我使用Set ,它不会并行运行。 我写了一个显示问题的代码示例: public static void main(String[] args) { ParallelTest test = new ParallelTest(); List list = Arrays.asList(1,2); Set set = new HashSet(list); ForkJoinPool forkJoinPool = new ForkJoinPool(4); System.out.println(“set print”); try { forkJoinPool.submit(() -> set.parallelStream().forEach(test::print) ).get(); } catch (Exception e) { return; } System.out.println(“\n\nlist print”); try { forkJoinPool.submit(() -> list.parallelStream().forEach(test::print) ).get(); } […]

Java8 Lambda:concat列表

我试图连接流的列表并处理它。 class A { public List bList; } List aList; aList.stream().map(a -> a.bList)…. 在这里我得到几个b的列表。 但是,我想在一个列表中收集我的所有b。 有任何想法吗 ?

在Java 8中将Map连接到String的最优雅方式

我喜欢番石榴 ,我会继续使用番石榴。 但是,在有意义的地方,我尝试使用Java 8中的“新东西”。 “问题” 假设我想在String加入url属性。 在Guava我会这样做: Map attributes = new HashMap(); attributes.put(“a”, “1”); attributes.put(“b”, “2”); attributes.put(“c”, “3”); // Guava way String result = Joiner.on(“&”).withKeyValueSeparator(“=”).join(attributes); result是a=1&b=2&c=3 。 题 在Java 8 (没有任何第三方库)中,最优雅的方法是什么?