标签: java-stream

如何检查Java 8 Stream是否为空?

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)

java java-8 java-stream

83
推荐指数
6
解决办法
7万
查看次数

如何在java 8中使用流从Integer中找到最大值?

我有一个列表,Integer listlist.stream()我想要的最大值.什么是最简单的方法?我需要比较器吗?

java-8 java-stream

83
推荐指数
2
解决办法
7万
查看次数

为什么在静态初始化程序中使用lambda的并行流导致死锁?

我遇到了一个奇怪的情况,在静态初始化程序中使用带有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)

这似乎是此行为的最小再现测试用例.如果我:

  • 将块放在main方法而不是静态初始化器中,
  • 删除并行化,或
  • 删除lambda,

代码立即完成.谁能解释这种行为?这是一个错误还是这个意图?

我正在使用OpenJDK版本1.8.0_66-internal.

java deadlock fork-join java-8 java-stream

82
推荐指数
3
解决办法
4222
查看次数

带有批处理的Java 8 Stream

我有一个包含项目列表的大文件.

我想创建一批项目,使用此批处理发出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())

最好的方法是什么?

java batch-processing java-8 java-stream

80
推荐指数
8
解决办法
4万
查看次数

是否可以在Android API <24上使用Java 8 Stream API?

我在这里看过这篇文章.但我仍然无法在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 android java-8 java-stream

80
推荐指数
4
解决办法
3万
查看次数

我们应该如何为空值管理jdk8流

你好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,我发现该功能非常危险,只能如下所示:

  • 开发人员确保没有空值(可能使用以前的.filter(o - > o!= null))
  • 开发人员确保应用程序永远不会生成null otter或特殊的NullOtter对象来处理.

什么是最佳选择,或任何其他选择?

谢谢!

java null java-8 java-stream

78
推荐指数
5
解决办法
10万
查看次数

如果找到的第一个元素为null,为什么findFirst()会抛出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)

第一项stringsnull,这是一个完全可以接受的值.此外,findFirst()返回一个Optional,这对于findFirst()能够处理nulls 更有意义.

编辑:更新orElse()不那么模棱两可.

java optional java-8 java-stream

77
推荐指数
4
解决办法
6万
查看次数

Java 8:使用换行符和缩进格式化lambda

我想用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)

java eclipse lambda java-8 java-stream

75
推荐指数
6
解决办法
4万
查看次数

如何将Java 8流收集到Guava ImmutableCollection中?

我想做以下事情:

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

guava java-8 java-stream

75
推荐指数
4
解决办法
2万
查看次数

takeWhile()与flatmap的工作方式不同

我正在创建片段与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)

java lambda java-stream java-9

75
推荐指数
4
解决办法
3874
查看次数