Questions tagged «java-stream»

将此标签用于与使用Stream API有关的问题。它是Java 8中引入的,支持对值流的功能样式操作,例如集合上的filter-map-reduce管道。

9
Java SE 8是否具有对或元组?
我正在玩Java SE 8中的惰性函数操作,我想要一个对对/元组map的索引,然后基于第二个元素,最后只输出索引。i(i, value[i])filtervalue[i] 我还必须忍受这一点吗:Java中的C ++ Pair <L,R>等效项是什么?在lambdas和stream的大胆新时代中? 更新:我提供了一个相当简化的示例,该示例在以下答案之一中提供了@dkatzel提供的简洁解决方案。但是,它不能一概而论。因此,让我添加一个更一般的示例: package com.example.test; import java.util.ArrayList; import java.util.stream.IntStream; public class Main { public static void main(String[] args) { boolean [][] directed_acyclic_graph = new boolean[][]{ {false, true, false, true, false, true}, {false, false, false, true, false, true}, {false, false, false, true, false, true}, {false, …

9
如何使用Java8 lambda反向排序流?
我正在使用Java lambda对列表进行排序。 如何以相反的方式对其进行排序? 我看到了这篇文章,但是我想使用java 8 lambda。 这是我的代码(我用* -1)作为hack Arrays.asList(files).stream() .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName())) .sorted(new Comparator<File>() { public int compare(File o1, File o2) { int answer; if (o1.lastModified() == o2.lastModified()) { answer = 0; } else if (o1.lastModified() > o2.lastModified()) { answer = 1; } else { answer = -1; } …

4
标准Kotlin库中提供了哪些Java 8 Stream.collect等效项?
在Java 8中,Stream.collect它允许对集合进行聚合。在Kotlin中,除了以stdlib中的扩展功能的集合形式存在之外,这并不完全相同。但尚不清楚不同用例的等效性。 例如,在JavaDocCollectors的顶部是为Java 8编写的示例,将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此可能应该以不同的方式编写它们。 在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,不能真正与相同的用例进行比较。有什么真正与案例相匹配的好示例,例如针对Java 8记录的案例Stream.collect?列表是: 将名称累积到列表中 将名称累积到TreeSet中 将元素转换为字符串并将其连接起来,并以逗号分隔 计算员工的薪金总额 按部门分组员工 按部门计算薪金总额 划分学生通过和失败 在上面链接的JavaDoc中有详细信息。 注意: 这个问题是作者故意写和回答的(“ 自我回答的问题”),因此SO中经常出现Kotlin主题的惯用答案。还要澄清一些针对Kotlin字母的非常古老的答案,这些答案对于当今的Kotlin而言并不准确。

5
使用流加BigDecimals
我有一个BigDecimals集合(在此示例中为LinkedList),我想将它们加在一起。是否可以为此使用流? 我注意到Stream该类有几种方法 Stream::mapToInt Stream::mapToDouble Stream::mapToLong 每种sum()方法都有一种方便的方法。但是,我们知道,float和double算术几乎总是一个坏主意。 那么,有没有一种方便的方法来汇总BigDecimals? 这是我到目前为止的代码。 public static void main(String[] args) { LinkedList<BigDecimal> values = new LinkedList<>(); values.add(BigDecimal.valueOf(.1)); values.add(BigDecimal.valueOf(1.1)); values.add(BigDecimal.valueOf(2.1)); values.add(BigDecimal.valueOf(.1)); // Classical Java approach BigDecimal sum = BigDecimal.ZERO; for(BigDecimal value : values) { System.out.println(value); sum = sum.add(value); } System.out.println("Sum = " + sum); // Java 8 approach …

7
Java 8:如何使用流中的异常抛出方法?
假设我有一个类和一个方法 class A { void foo() throws Exception() { ... } } 现在,我想为A流所传递的每个实例调用foo : void bar() throws Exception { Stream<A> as = ... as.forEach(a -> a.foo()); } 问题:如何正确处理异常?该代码无法在我的机器上编译,因为我不处理foo()可能引发的异常。在throws Exception的bar似乎是没用在这里。这是为什么?

8
向流中添加两个Java 8流或一个额外的元素
我可以添加流或其他元素,如下所示: Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element)); 我可以随时添加新内容,例如: Stream stream = Stream.concat( Stream.concat( stream1.filter(x -> x!=0), stream2) .filter(x -> x!=1), Stream.of(element)) .filter(x -> x!=2); 但这是丑陋的,因为concat是静态的。如果concat是实例方法,则上面的示例将更容易阅读: Stream stream = stream1.concat(stream2).concat(element); 和 Stream stream = stream1 .filter(x -> x!=0) .concat(stream2) .filter(x -> x!=1) .concat(element) .filter(x -> x!=2); 我的问题是: 1)是否有充分的理由为什么它concat是静态的?还是我缺少一些等效的实例方法? 2)无论如何,有没有更好的方法?

9
我应该返回收藏集还是流?
假设我有一个将只读视图返回到成员列表的方法: class Team { private List < Player > players = new ArrayList < > (); // ... public List < Player > getPlayers() { return Collections.unmodifiableList(players); } } 进一步假设所有客户要做的就是立即遍历列表一次。也许将播放器放入JList之类。客户端就不能存储到列表的引用以便稍后进行检查! 在这种常见情况下,我应该返回流吗? public Stream < Player > getPlayers() { return players.stream(); } 还是在Java中返回流非惯用语?流是否设计为始终在创建它们的相同表达式内被“终止”?

4
是否可以在Java 8中强制转换Stream?
是否可以在Java 8中强制转换流?说我有一个对象列表,我可以做这样的事情来过滤掉所有其他对象: Stream.of(objects).filter(c -> c instanceof Client) 不过,在此之后,如果我想与客户做些事情,则需要对每个客户进行转换: Stream.of(objects).filter(c -> c instanceof Client) .map(c -> ((Client) c).getID()).forEach(System.out::println); 这看起来有点难看。是否可以将整个流转换为其他类型?像蒙上了Stream<Object>一个Stream<Client>? 请忽略以下事实:这样做可能意味着不良的设计。我们在计算机科学课上做了类似的事情,所以我一直在研究Java 8的新功能,并且好奇是否有可能。
160 java  java-8  java-stream 


26
Java 8流反向顺序
一般问题:反向流的正确方法是什么?假设我们不知道流包含什么类型的元素,反转任何流的通用方法是什么? 具体问题: IntStream提供了生成特定范围内的整数的范围方法IntStream.range(-range, 0),现在我想将其范围从0切换为负数将不起作用,也无法使用Integer::compare List<Integer> list = Arrays.asList(1,2,3,4); list.stream().sorted(Integer::compare).forEach(System.out::println); 与IntStream我会得到这个编译器错误 错误:(191,0)ajc:sorted()类型中的方法IntStream不适用于参数(Integer::compare) 我在这里想念什么?

14
使用带有Lambda的JDK8压缩流(java.util.stream.Streams.zip)
在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于对流进行zip处理(这在Dhananjay Nene的Exploring Java8 Lambdas。Part 1教程中进行了说明)。该功能: 创建一个懒惰且顺序的组合Stream,其元素是将两个流的元素组合在一起的结果。 然而,在b98中,这种现象消失了。实际上,在b98的java.util.stream中Streams甚至无法访问该类。 此功能是否已被移走,如果是的话,如何使用b98简洁地压缩流? 我想到的应用程序是此Shen的java实现中的,我在其中替换了zip功能。 static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred) static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred) 具有相当冗长的代码的功能(不使用b98的功能)。

2
如何确保java8流中的处理顺序?
我想处理XMLJava对象中的列表。我必须确保处理所有元素,以便收到它们。 因此sequential,stream我应该使用它吗? list.stream().sequential().filter().forEach() 还是只要我不使用并行性就足够使用流? list.stream().filter().forEach()
148 java  java-8  java-stream 

10
您可以将一个流分成两个流吗?
我有一个由Java 8流表示的数据集: Stream<T> stream = ...; 我可以看到如何对其进行过滤以获取随机子集-例如 Random r = new Random(); PrimitiveIterator.OfInt coin = r.ints(0, 2).iterator(); Stream<T> heads = stream.filter((x) -> (coin.nextInt() == 0)); 我还可以看到如何减少该流,例如,获得两个表示数据集的两个随机一半的列表,然后将它们转换回流。但是,是否有直接方法可以从最初的一个生成两个流?就像是 (heads, tails) = stream.[some kind of split based on filter] 感谢您的任何见解。
146 java  java-8  java-stream 


7
Java 8 Streams-收集与减少
什么时候使用collect()vs reduce()?有没有人有好的,具体的例子说明何时最好以一种或另一种方式走? Javadoc提到collect()是一个可变的reduce。 鉴于这是一个可变的减少,我假设它需要同步(内部),这反过来可能对性能造成不利影响。大概reduce()更容易并行化,但需要在精简的每个步骤之后都必须创建新的数据结构以返回以作为代价。 上面的陈述是猜测,不过,我很乐意在此鸣叫。
143 java  java-8  java-stream 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.