Tag: java stream

压缩列表列表的3种方法。 有理由更喜欢其中之一吗?

假设我们有一个如下列表。 CoreResult有一个List类型的字段。 final List list = new LinkedList(SOME_DATA); 目标是在从每个CoreResult对象中提取特定字段后展平列表。 这里有3种可能的选择。 他们中的任何一个比其他人更好吗? 选项1 :通过map()提取字段并在收集器内展平 final List A = list.stream().map(CoreResult::getField) .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll); 选项2 :通过map()提取字段,通过flatMap() ,简单收集器展平 final List B = list.stream().map(CoreResult::getField) .flatMap(Collection::stream).collect(Collectors.toList()); 选项3 :通过flatMap() ,简单的收集器一次性提取一个字段并展平 final List C = list.stream().flatMap( x -> x.getField().stream()).collect(Collectors.toList()); 如果不需要从CoreResult中提取任何字段,那么答案是否会有所不同,而是想要简单地展平List<List> ?

尽可能在收集器中使用Characteristics.UNORDERED很重要吗?

由于我使用了很多流,其中一些处理大量数据,我认为最好预先分配基于集合的收集器大小,以防止随着集合的增长而进行昂贵的重新分配。 所以我提出了这个,以及类似的其他集合类型: public static Collector<T, ?, Set> toSetSized(int initialCapacity) { return Collectors.toCollection(()-> new HashSet(initialCapacity)); } 像这样使用 Set fooSet = myFooStream.collect(toSetSized(100000)); 我担心的是Collectors.toSet()的实现设置了一个Collectors.toCollection()没有的Characteristics枚举: Characteristics.UNORDERED 。 Collectors.toCollection()没有方便的变体来设置超出默认值的所需特性,并且由于可见性问题,我无法复制Collectors.toSet()的实现。 所以,为了设置UNORDERED特性,我不得不这样做: static Collector<T,?,Set> toSetSized(int initialCapacity){ return Collector.of( () -> new HashSet(initialCapacity), Set::add, (c1, c2) -> { c1.addAll(c2); return c1; }, new Collector.Characteristics[]{IDENTITY_FINISH, UNORDERED}); } 所以这是我的问题:1。这是我唯一的选择,为自定义toSet() 2之类的东西创建一个无序收集器。如果我希望它理想地工作,是否有必要应用无序特征? 我在这个论坛上读到了一个问题,在那里我了解到无序特征不再向后传播到Stream中。 它仍然有用吗?

Java 8 Streams – 超时?

我想循环一个巨大的数组并做一组复杂的指令需要很长时间。 但是,如果超过30秒,我希望它放弃。 恩。 final long start = System.currentTimeMillis(); myDataStructure.stream() .while(() -> System.currentTimeMillis() { … }); 如果满足某个条件,我想避免在forEach调用中return 。

用于int范围的Java 8 IntStream?

有没有办法为一系列的int创建一个IntStream ? 就像我想要将值1到1000流,我可以调用一些IntStream静态工厂来传输该范围? IntStream.forRange(1, 1000).forEach(//do something…

将for循环转换为concat String转换为lambda表达式

我有以下for循环,它循环遍历字符串列表并将每个单词的第一个字符存储在StringBuilder 。 我想知道如何将其转换为lambda表达式 StringBuilder chars = new StringBuilder(); for (String l : list) { chars.append(l.charAt(0)); }

java.util.stream.Streamable发生了什么?

像这样的早期jdk8-ea javadocs表明有一个java.util.stream.Streamable接口,它似乎与Iterable与Iterator具有相同的Stream关系。 现在看来我们已经陷入了Supplier ,这肯定是不一样的。 Streamable发生了什么事?

Java 8 mapToInt(mapToInt(e – > e))如何提高性能?

我正在阅读“Java 8 Lambdas”这本书,并且在某些时候作者说:“由于性能优势,尽可能使用原始专用函数是个好主意。” 他在这里指的是mapToInt,mapToLong等。 事情是我不知道性能来自哪里说实话。 我们来看一个例子: // Consider this a very very long list, with a lot of elements List list = Arrays.asList(1, 2, 3, 4); //sum it, flavour 1 int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue(); //sum it, flavour 2 int sum2 = list.stream().mapToInt(e -> e).sum(); System.out.println(sum1 + ” ” + […]

如何在Java 8中以相反的顺序从列表中获取有序流

是否有一种理智的方式从列表中获取有序流(具体来说,数组列表,但它应该无关紧要)流式元素与它们在原始列表中的方式相反? 我正在寻找一种不涉及缓冲数据的解决方案(收集器,另一个列表,数组等,因为它们复制了浪费的容器),或者使用Collections.reverse (因为它修改了列表)。 到目前为止,我在这里看到的最Spliterator的方法是实现我自己的Spliterator版本,它是ORDERED并反向推进列表,或者实现反向Iterator ,并在其上使用Spliterators.spliteratorUnknownSize(iterator,ORDERED) 。 注意这个问题与Java 8流逆向顺序不同 :其他问题询问如何反转流(一般情况下这是不可能的),并且答案提供了以某种方式反转源(我不想这样做),然后传输反向源。 逆转源的成本是O(N),如果可能的话我想完全避免它。

Java 8流和地图值得吗?

感觉就像java 8流和映射函数那么冗长,它们并不是真正的改进。 例如,我编写了一些使用集合生成另一个修改过的集合的代码: private List getDartFields(Class model) { List fields = new ArrayList(); for (Field field : model.getDeclaredFields()) { if (!Modifier.isStatic(field.getModifiers())) { fields.add(DartField.getDartField(field)); } } return fields; } 这似乎是java 8流及其function的理想用例,所以我重写了它: private List getDartFields(Class model) { return Arrays.asList(model.getDeclaredFields()) .stream() .filter(field -> !Modifier.isStatic(field.getModifiers())) .map(field -> DartField.getDartField(field)) .collect(Collectors.toList()); } 但我不确定我更喜欢那个。 这是236个字符,而普通风格的java则是239个字符。 它似乎没有或多或少可读。 很高兴您不必声明ArrayList ,但需要调用.collect(Collectors.toList())和Arrays.asList (取决于数据类型)并不是更好。 使用像我这样的.stream()是否有一些实际的改进,或者这只是一种有趣的方式来抛弃任何不知道函数式编程的循环的同事? 我想如果我动态地传递filter或映射lambdas它会很有用,但如果你不需要这样做……

使用Java 8将String数组转换为int数组的最简单方法是什么?

我目前正在学习如何使用Java,我的朋友告诉我,使用Java 8时可以简化这段代码。他指出可以简化parseIntArray 。 你会如何在Java 8中做到这一点? public class Solution { public static void main(String[] args) { Scanner input = new Scanner(System.in); String[] tokens = input.nextLine().split(” “); int[] ints = parseIntArray(tokens); } static int[] parseIntArray(String[] arr) { int[] ints = new int[arr.length]; for (int i = 0; i < ints.length; i++) { ints[i] = Integer.parseInt(arr[i]); } return […]