我可以添加流或额外的元素,如下所示:
Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element));
Run Code Online (Sandbox Code Playgroud)
我可以随时添加新内容,如下所示:
Stream stream = Stream.concat(
Stream.concat(
stream1.filter(x -> x!=0), stream2)
.filter(x -> x!=1),
Stream.of(element))
.filter(x -> x!=2);
Run Code Online (Sandbox Code Playgroud)
但这很难看,因为它concat是静态的.如果concat是实例方法,上面的示例将更容易阅读:
Stream stream = stream1.concat(stream2).concat(element);
Run Code Online (Sandbox Code Playgroud)
和
Stream stream = stream1
.filter(x -> x!=0)
.concat(stream2)
.filter(x -> x!=1)
.concat(element)
.filter(x -> x!=2);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1)concat静态有什么好的理由吗?或者是否有一些我缺少的等效实例方法?
2)无论如何,有没有更好的方法呢?
我有一个BigDecimals的集合(在这个例子中,a LinkedList)我想加在一起.是否可以使用流?
我注意到这个Stream课有几种方法
Stream::mapToInt
Stream::mapToDouble
Stream::mapToLong
Run Code Online (Sandbox Code Playgroud)
每个都有一个方便的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
values.forEach((value) -> System.out.println(value));
System.out.println("Sum = " + values.stream().mapToDouble(BigDecimal::doubleValue).sum());
System.out.println(values.stream().mapToDouble(BigDecimal::doubleValue).summaryStatistics().toString());
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我正在总结BigDecimals BigDecimal::doubleValue(),但这(正如预期的那样)并不准确.
后代的回答后编辑:
这两个答案都非常有帮助.我想补充一点:我的现实场景不涉及原始集合BigDecimal,它们包含在发票中.但是,通过使用map()流的功能,我能够修改Aman Agnihotri的答案以解决这个问题: …
假设我有一个类和一个方法
class A {
void foo() throws Exception() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想为A一个流传递的每个实例调用foo,如:
void bar() throws Exception {
Stream<A> as = ...
as.forEach(a -> a.foo());
}
Run Code Online (Sandbox Code Playgroud)
问题:如何正确处理异常?代码无法在我的机器上编译,因为我没有处理foo()可能抛出的异常.在throws Exception的bar似乎是没用在这里.这是为什么?
我正在使用java lambda对列表进行排序.
我怎样才能以相反的方式对它进行排序?
我看到这篇文章,但我想使用java 8 lambda.
这是我的代码(我使用*-1)作为黑客
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;
}
return -1 * answer;
}
})
.skip(numOfNewestToLeave)
.forEach(item -> item.delete());
Run Code Online (Sandbox Code Playgroud) 假设我有一个方法将只读视图返回到成员列表:
class Team {
private List < Player > players = new ArrayList < > ();
// ...
public List < Player > getPlayers() {
return Collections.unmodifiableList(players);
}
}
Run Code Online (Sandbox Code Playgroud)
进一步假设所有客户端都立即迭代一次列表.也许将玩家放入JList或其他东西.客户端就不能存储到列表的引用以便稍后进行检查!
鉴于这种常见情况,我应该返回一个流吗?
public Stream < Player > getPlayers() {
return players.stream();
}
Run Code Online (Sandbox Code Playgroud)
或者在Java中返回非惯用的流?设计的流是否始终在它们创建的同一表达式中"终止"?
在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于压缩流(这在教程Exploring Java8 Lambdas中说明.Dhananjay Nene的第1部分).这个功能:
创建一个惰性和顺序组合Stream,其元素是组合两个流的元素的结果.
然而在b98中,这已经消失了.事实上,在b98Streams中的java.util.stream中甚至无法访问该类.
是否已移动此功能,如果是这样,我如何使用b98简洁地压缩流?
我想到的应用程序是在Shen的这个java实现中,我在其中替换了zip中的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中的功能).
lambda functional-programming lazy-evaluation java-8 java-stream
是否可以在Java 8中强制转换流?假设我有一个对象列表,我可以做这样的事情来过滤掉所有其他对象:
Stream.of(objects).filter(c -> c instanceof Client)
Run Code Online (Sandbox Code Playgroud)
在此之后,如果我想对客户做一些事情,我需要投下每个客户:
Stream.of(objects).filter(c -> c instanceof Client)
.map(c -> ((Client) c).getID()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
这看起来有点难看.是否可以将整个流转换为其他类型?像流延Stream<Object>到Stream<Client>?
请忽略这样的事实,即做这样的事情可能意味着糟糕的设计.我们在计算机科学课上做这样的事情,所以我正在研究java 8的新功能,如果可能的话,我很好奇.
收集器的Javadoc显示如何将流的元素收集到新的List中.是否有一个单行程序将结果添加到现有的ArrayList中?
Java 8流是否类似于RxJava observables?
Java 8流定义:
新
java.util.stream包中的类提供Stream API以支持对元素流的功能样式操作.
一般问题:反转流的正确方法是什么?假设我们不知道流包含哪种类型的元素,那么反转任何流的通用方法是什么?
具体问题:
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);
Run Code Online (Sandbox Code Playgroud)
与IntStream我会得到这个编译器错误
错误:(191,0)ajc:
sorted()类型中的方法IntStream不适用于参数(Integer::compare)
我在这里想念的是什么?
java-8 ×10
java-stream ×10
java ×8
lambda ×2
bigdecimal ×1
collections ×1
collectors ×1
concat ×1
observable ×1
rx-java ×1