Stream作为非终端操作,如何检查a 是否为空并抛出异常(如果不是)?
基本上,我正在寻找与下面的代码等效的东西,但没有实现中间的流.特别是,在终端操作实际消耗流之前不应进行检查.
public Stream<Thing> getFilteredThings() {
Stream<Thing> stream = getThings().stream()
.filter(Thing::isFoo)
.filter(Thing::isBar);
return nonEmptyStream(stream, () -> {
throw new RuntimeException("No foo bar things available")
});
}
private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) {
List<T> list = stream.collect(Collectors.toList());
if (list.isEmpty()) list.add(defaultValue.get());
return list.stream();
}
Run Code Online (Sandbox Code Playgroud) 我有一个列表,Integer list从list.stream()我想要的最大值.什么是最简单的方法?我需要比较器吗?
我遇到了一个奇怪的情况,在静态初始化程序中使用带有lambda的并行流看似永远没有CPU利用率.这是代码:
class Deadlock {
static {
IntStream.range(0, 10000).parallel().map(i -> i).count();
System.out.println("done");
}
public static void main(final String[] args) {}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是此行为的最小再现测试用例.如果我:
代码立即完成.谁能解释这种行为?这是一个错误还是这个意图?
我正在使用OpenJDK版本1.8.0_66-internal.
我有一个包含项目列表的大文件.
我想创建一批项目,使用此批处理发出HTTP请求(所有项目都需要作为HTTP请求中的参数).我可以通过for循环很容易地完成它,但作为Java 8的爱好者,我想尝试用Java 8的Stream框架编写它(并获得延迟处理的好处).
例:
List<String> batch = new ArrayList<>(BATCH_SIZE);
for (int i = 0; i < data.size(); i++) {
batch.add(data.get(i));
if (batch.size() == BATCH_SIZE) process(batch);
}
if (batch.size() > 0) process(batch);
Run Code Online (Sandbox Code Playgroud)
我想做一些很长的路要走
lazyFileStream.group(500).map(processBatch).collect(toList())
最好的方法是什么?
我在这里看过这篇文章.但我仍然无法在minSdkVersion <24上运行包含Java 8 Stream API功能的代码,如下所示.
List<Car> newCars = cars.stream()
.filter(s -> s.getColor().equals("red"))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
由于错误消息,这不会运行
调用需要API级别24(当前最小值为15):java.util.Collection #stream
那么有人知道解决方案吗?
你好Java开发人员,
我知道主题可能有点 in advance因为JDK8尚未发布(现在还不是.)但我正在阅读一些关于Lambda表达式的文章,特别是与新集合API相关的部分,称为Stream.
以下是Java Magazine文章中给出的示例(它是一个水獭种群算法..):
Set<Otter> otters = getOtters();
System.out.println(otters.stream()
.filter(o -> !o.isWild())
.map(o -> o.getKeeper())
.filter(k -> k.isFemale())
.into(new ArrayList<>())
.size());
Run Code Online (Sandbox Code Playgroud)
我的问题是如果在Set内部迭代的中间,其中一个otter为null会发生什么?
我希望抛出NullPointerException,但也许我仍然坚持以前的开发范例(非功能),有人可以启发我应该如何处理它?
如果这确实抛出了NullPointerException,我发现该功能非常危险,只能如下所示:
什么是最佳选择,或任何其他选择?
谢谢!
为什么这会抛出java.lang.NullPointerException?
List<String> strings = new ArrayList<>();
strings.add(null);
strings.add("test");
String firstString = strings.stream()
.findFirst() // Exception thrown here
.orElse("StringWhenListIsEmpty");
//.orElse(null); // Changing the `orElse()` to avoid ambiguity
Run Code Online (Sandbox Code Playgroud)
第一项strings是null,这是一个完全可以接受的值.此外,findFirst()返回一个Optional,这对于findFirst()能够处理nulls 更有意义.
编辑:更新orElse()不那么模棱两可.
我想用lambda缩进实现的目的如下:
多行声明:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl)
.filter(
(x) ->
{
return x.contains("(M)");
}
).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
单行声明:
List<String> strings = Arrays.stream(ppl)
.map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)"))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
目前,Eclipse正在自动格式化为以下内容:
多行声明:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl).filter((x) ->
{
return x.contains("(M)");
}).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
单行声明:
String[] ppl …Run Code Online (Sandbox Code Playgroud) 我想做以下事情:
List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是在某种程度上,结果列表是Guava的实现ImmutableList.
我知道我能做到
List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList());
List<Integer> immutableList = ImmutableList.copyOf(list);
Run Code Online (Sandbox Code Playgroud)
但是我想直接收集它.我试过了
List<Integer> list = IntStream.range(0, 7)
.collect(Collectors.toCollection(ImmutableList::of));
Run Code Online (Sandbox Code Playgroud)
但它引发了一个例外:
com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:96)中的java.lang.UnsupportedOperationException
我正在创建片段与takeWhile探索其可能性.与flatMap结合使用时,行为与预期不符.请在下面找到代码段.
String[][] strArray = {{"Sample1", "Sample2"}, {"Sample3", "Sample4", "Sample5"}};
Arrays.stream(strArray)
.flatMap(indStream -> Arrays.stream(indStream))
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
Run Code Online (Sandbox Code Playgroud)
实际产量:
Sample1
Sample2
Sample3
Sample5
Run Code Online (Sandbox Code Playgroud)
ExpectedOutput:
Sample1
Sample2
Sample3
Run Code Online (Sandbox Code Playgroud)
期望的原因是takeWhile应该执行直到内部条件变为真.我还在flatmap中添加了printout语句以进行调试.流返回两次,符合预期.
但是,如果链中没有flatmap,这样可以正常工作.
String[] strArraySingle = {"Sample3", "Sample4", "Sample5"};
Arrays.stream(strArraySingle)
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
Run Code Online (Sandbox Code Playgroud)
实际产量:
Sample3
Run Code Online (Sandbox Code Playgroud)
这里实际输出与预期输出匹配.
免责声明:这些代码段仅用于代码练习,不提供任何有效的用例.
更新:
错误JDK-8193856:修复将作为JDK 10的一部分提供.更改将更正whileOps
Sink :: accept
@Override
public void accept(T t) {
if (take = predicate.test(t)) {
downstream.accept(t);
}
}
Run Code Online (Sandbox Code Playgroud)
改变实施:
@Override
public void accept(T t) {
if (take && …Run Code Online (Sandbox Code Playgroud)