Tag: java stream

跳过Stream 中的最后x个元素

如果我有一个Stream ,我可以轻松地使用skip(long)来跳过流的前几个元素。 但是,在流的末尾跳过给定数量的元素似乎没有等价物。 最明显的解决方案是使用limit(originalLength – elementsToRemoveAtEnd) ,但这需要事先知道初始长度,但情况并非总是如此。 有没有办法删除未知长度的流的最后几个元素,而不必将其收集到Collection ,计算元素并再次流动它?

Java流API:身份仿函数有语法糖吗?

我们在对象列表中使用多个Map作为简单的内存DB: class Person { public String id; public String phone; public String email; // and get/set and other fields… } List persons; Map emailLookup = persons.stream() .collect(Collectors.toMap(Person::getEmail, p -> p)); Map phoneLookup = persons.stream() .collect(Collectors.toMap(Person::getPhone, p -> p)); Map idLookup = persons.stream() .collect(Collectors.toMap(Person::getId, p -> p)); 在Java SE中是否有任何语法糖或内置函子用其他东西替换p -> p ?

Arrays.asList与Arrays.stream一起使用forEach()

如果您有一个Array并且想要使用Java8 forEach()方法,那么哪种方法更好或更有效: Arrays.asList(new String[]{“hallo”,”hi”}).forEach(System.out::println); 要么 Arrays.stream(new String[]{“hallo”,”hi”}).forEach(System.out::println); 差异是显着的还是有更好的解决方案来解决这个问题?

将所有列表值合并在一个地图中

我想将地图转换为: Map<String, List> 至 List 其中结果列表是所有List值的合并。

什么更有效:排序流或排序列表?

假设我们在集合中有一些项目,我们想要使用某个比较器对它们进行排序,期望列表中的结果: Collection items = …; Comparator itemComparator = …; 其中一种方法是对列表中的项进行排序,例如: List sortedItems = new ArrayList(items); Collections.sort(sortedItems, itemComparator); 另一种方法是使用排序流: List sortedItems = items .stream() .sorted(itemComparator) .collect(Collectors.toList()); 我想知道,哪种方法更有效率? 排序流是否有任何优点(如多核上的紧固排序)? 从运行时复杂性/速度的角度来看,效率很高。 我不相信自己实现了一个完美的基准,并且研究SortedOps并没有真正启发我。

Java 8 Streams:IntStream到String

在Java 8流API中,在任何String对象上调用chars()都会返回包含所有字符的IntStream对象。 将返回的IntStream对象转换回String的正确方法是什么? 调用toArray()会给我一个int[] ,任何String构造函数都不接受它。

将嵌套for循环重构为Java 8流

我有以下for循环: List mapList = new ArrayList(); for (Resource resource : getResources()) { for (Method method : resource.getMethods()) { mapList.add(getMap(resource,method)); } } return mapList; 我怎么能将这个嵌套循环重构为Java 8流?

是否可以使用Streams.intRange函数?

我想使用Streams.intRange(int start,int end,int step)来实现反向排序流。 但是,似乎java.util.Streams类不再可用(但它仍然在标准库中的rt.jar中)。 这个方法是在其他类中还是用其他类替换?

Java 8流处理不流畅

我遇到了Java 8流的问题,其中数据是在突然批量处理而不是在请求时处理的。 我有一个相当复杂的流 – 必须并行化,因为我使用concat合并两个流。 我的问题源于这样一个事实:数据似乎在大量分钟内解析 – 有时甚至是数小时。 我希望一旦Stream读取传入数据,就会发生这种处理,以分散工作负载。 批量处理几乎在所有方面都是违反直觉的。 所以,问题是为什么这个批量收集发生以及如何避免它。 我的输入是一个未知大小的Spliterator,我使用forEach作为终端操作。

在multithreading情况下使用限制流的最佳方式性能

我观看了JoséPaumard在InfoQ上的演讲: http : //www.infoq.com/fr/presentations/jdk8-lambdas-streams-collectors (法语) 问题是我被困在这一点上。 要使用流和multithreading收集1M Long ,我们可以这样做: Stream stream = Stream.generate(() -> ThreadLocalRandom.current().nextLong()) ; List list1 = stream.parallel().limit(10_000_000).collect(Collectors.toList()) ; 但考虑到线程始终检查所述限制以阻碍性能。 在那次演讲中我们也看到了第二个解决方案: Stream stream = ThreadLocalRandom.current().longs(10_000_000).mapToObj(Long::new) ; List list = stream.parallel().collect(Collectors.toList()) ; 它似乎是更好的表现。 所以这是我的问题:为什么第二个代码更好,是否有更好的,或者至少成本更低的方法呢?