标签: java-8

了解Java 8中的Spliterator,Collector和Stream

我无法理解StreamJava 8中的接口,特别是它SpliteratorCollector接口有关的地方.我的问题是我根本就没有理解SpliteratorCollector接口,并因此在Stream界面依然有些模糊了我.

究竟什么是a Spliterator和a Collector,我该如何使用它们?如果我愿意自己编写SpliteratorCollector(也可能是我自己的编写Stream过程),我应该做什么而不是做什么?

我阅读了一些散布在网络上的例子,但由于这里的所有内容都是新的并且可能会有变化,因此示例和教程仍然非常稀少.

java lambda java-8 spliterator

135
推荐指数
4
解决办法
7万
查看次数

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);
Run Code Online (Sandbox Code Playgroud)

IntStream我会得到这个编译器错误

错误:(191,0)ajc:sorted()类型中的方法IntStream不适用于参数(Integer::compare)

我在这里想念的是什么?

java java-8 java-stream

135
推荐指数
13
解决办法
14万
查看次数

使用Maven时如何解决更严格的Java 8 Javadoc问题

你很快就会发现JDK8在Javadoc方面要严格得多(默认情况下).(链接 - 见最后一点)

如果你从来没有生成任何Javadoc那么你当然不会遇到任何问题,但Maven发布过程之类的事情以及可能你的CI版本会突然失败,因为它们与JDK7一起工作得很好.任何检查Javadoc工具退出值的东西现在都会失败.warnings与JDK7相比,JDK8 Javadoc可能也更冗长,但这不是这里的范围.我们在谈论errors!

存在这个问题是为了收集有关如何处理的提案.什么是最好的方法?是否应该在源代码文件中一劳永逸地修复这些错误?如果你有一个巨大的代码库,这可能是很多工作.还有哪些其他选择?

您也可以评论以前通过的失败的故事.

现在失败的恐怖故事

wsimport工具

wsimport工具是用于创建Web服务使用者的代码生成器.它包含在JDK中.即使您使用wsimportJDK8中的工具,它仍然会生成无法使用JDK8中的javadoc编译器编译的源代码.

@author标签

我打开3-4岁的源代码文件,看到这个:

/**
 * My very best class
 * @author John <john.doe@mine.com> 
 */
Run Code Online (Sandbox Code Playgroud)

现在由于<字符而失败.严格来说,这是合理的,但不是很宽容.

HTML表格

Javadoc中的HTML表格?考虑这个有效的HTML:

/**
 *
 * <table>
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */
Run Code Online (Sandbox Code Playgroud)

这现在失败并显示错误消息no summary or caption for table.一个快速解决方法是这样做:

/**
 *
 * <table summary="">
 *   <tr>
 *      <td>Col1</td><td>Col2</td><td>Col3</td>
 *   </tr>
 * </table>
 */
Run Code Online (Sandbox Code Playgroud)

但为什么这必须是一个来自Javadoc工具的停止世界错误击败我?

现在因为更明显的原因而失败的事情

  1. 链接无效,例如 {@link notexist}
  2. 格式错误的HTML,例如 always returns <code>true<code> …

java maven java-8

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

如何确保java8流中的处理顺序?

我想处理XMLjava对象中的列表.我必须确保按顺序处理所有元素.

因此sequential,stream我应该每次使用我吗? list.stream().sequential().filter().forEach()

或者只要我不使用并行性就足以使用流? list.stream().filter().forEach()

java java-8 java-stream

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

你能将一个流分成两个流吗?

我有一个由Java 8流表示的数据集:

Stream<T> stream = ...;
Run Code Online (Sandbox Code Playgroud)

我可以看到如何过滤它以获得随机子集 - 例如

Random r = new Random();
PrimitiveIterator.OfInt coin = r.ints(0, 2).iterator();   
Stream<T> heads = stream.filter((x) -> (coin.nextInt() == 0));
Run Code Online (Sandbox Code Playgroud)

我还可以看到如何减少此流以获得,例如,两个列表代表数据集的两个随机半部分,然后将它们转换回流.但是,有没有直接的方法从最初的流生成两个流?就像是

(heads, tails) = stream.[some kind of split based on filter]
Run Code Online (Sandbox Code Playgroud)

感谢您的任何见解.

java java-8 java-stream

129
推荐指数
7
解决办法
8万
查看次数

Java 8 Streams - 收集与减少

你什么时候使用collect()vs reduce()?有没有人有一个好的,具体的例子,说明哪种方式更好?

Javadoc提到collect()是一个可变的减少.

鉴于它是可变的减少,我认为它需要同步(内部),这反过来可能对性能有害.据推测reduce(),更容易并行化,代价是必须在reduce中的每个步骤之后创建一个新的数据结构.

上面的陈述是猜测,但我喜欢这里的专家.

java java-8 java-stream

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

带有索引的Java 8 forEach

有没有办法forEach在Java 8中构建一个使用索引进行迭代的方法?理想情况下,我喜欢这样的事情:

params.forEach((idx, e) -> query.bind(idx, e));
Run Code Online (Sandbox Code Playgroud)

我现在能做的最好的事情是:

int idx = 0;
params.forEach(e -> {
  query.bind(idx, e);
  idx++;
});
Run Code Online (Sandbox Code Playgroud)

java foreach for-loop java-8

129
推荐指数
3
解决办法
18万
查看次数

如何设置IntelliJ IDEA Project SDK

我刚刚安装了IntelliJ IDEA,当我尝试创建我的第一个Project时,它要求我设置Project SDK.当我点击"JDK"时,它要求我选择JDK的主目录,如此图所示.

在此输入图像描述

我无法找到它的位置.

java sdk intellij-idea java-7 java-8

128
推荐指数
2
解决办法
26万
查看次数

可选orElse Java中的可选项

我一直在使用Java 8中的新Optional类型,我遇到了似乎是功能上不支持的常见操作:"orElseOptional"

考虑以下模式:

Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
    Optional<Result> resultFromServiceB = serviceB(args);
    if (resultFromServiceB.isPresent) return resultFromServiceB;
    else return serviceC(args);
}
Run Code Online (Sandbox Code Playgroud)

这种模式有很多种形式,但归结为在一个可选项上需要一个"orElse",它接受一个生成一个新的可选项的函数,只有当前的一个不存在时才被调用.

它的实现看起来像这样:

public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
    return value != null ? this : other.get();
}
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有这样的方法不存在的原因,如果我只是以一种无意的方式使用Optional,以及人们提出了处理这种情况的其他方式.

我应该说,我认为涉及自定义实用程序类/方法的解决方案并不优雅,因为使用我的代码的人不一定知道它们存在.

另外,如果有人知道,这样的方法是否会包含在JDK 9中,我可以在哪里提出这样的方法?对我来说,这似乎是对API的一个相当明显的遗漏.

java lambda optional java-8 java-9

128
推荐指数
5
解决办法
7万
查看次数

如何从数组创建流?

目前,每当我需要从数组创建流时,我都会这样做

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Run Code Online (Sandbox Code Playgroud)

是否有一些从数组创建流的直接方法?

java arrays java-8 java-stream

127
推荐指数
3
解决办法
6万
查看次数