我想处理XMLjava对象中的列表.我必须确保按顺序处理所有元素.
因此sequential,stream我应该每次使用我吗?
list.stream().sequential().filter().forEach()
或者只要我不使用并行性就足以使用流?
list.stream().filter().forEach()
我有一个由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)
感谢您的任何见解.
你什么时候使用collect()vs reduce()?有没有人有一个好的,具体的例子,说明哪种方式更好?
鉴于它是可变的减少,我认为它需要同步(内部),这反过来可能对性能有害.据推测reduce(),更容易并行化,代价是必须在reduce中的每个步骤之后创建一个新的数据结构.
上面的陈述是猜测,但我喜欢这里的专家.
目前,每当我需要从数组创建流时,我都会这样做
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Run Code Online (Sandbox Code Playgroud)
是否有一些从数组创建流的直接方法?
我是Java 8的新手.我仍然不深入了解API,但我已经做了一个小的非正式基准测试来比较新Streams API与优秀旧Collections的性能.
测试包括过滤一个列表Integer,并为每个偶数计算平方根并将其存储在结果List中Double.
这是代码:
public static void main(String[] args) {
//Calculating square root of even numbers from 1 to N
int min = 1;
int max = 1000000;
List<Integer> sourceList = new ArrayList<>();
for (int i = min; i < max; i++) {
sourceList.add(i);
}
List<Double> result = new LinkedList<>();
//Collections approach
long t0 = System.nanoTime();
long elapsed = 0;
for (Integer i : sourceList) {
if(i % 2 == 0){
result.add(Math.sqrt(i));
} …Run Code Online (Sandbox Code Playgroud) 我刚刚开始研究Java 8并试用lambdas我以为我会尝试重写一个我最近编写的非常简单的东西.我需要将String of Map转换为Column到另一个String to Column的Map,其中新Map中的Column是第一个Map中Column的防御副本.列具有复制构造函数.我到目前为止最接近的是:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
Run Code Online (Sandbox Code Playgroud)
但我相信必须有一个更好的方法去做,我会感激一些建议.
我无法完全理解combinerStreams reduce方法中实现的角色.
例如,以下代码不编译:
int length = asList("str1", "str2").stream()
.reduce(0, (accumulatedInt, str) -> accumulatedInt + str.length());
Run Code Online (Sandbox Code Playgroud)
编译错误说:( 参数不匹配; int无法转换为java.lang.String)
但是这段代码确实编译:
int length = asList("str1", "str2").stream()
.reduce(0, (accumulatedInt, str ) -> accumulatedInt + str.length(),
(accumulatedInt, accumulatedInt2) -> accumulatedInt + accumulatedInt2);
Run Code Online (Sandbox Code Playgroud)
我知道组合器方法用于并行流 - 所以在我的例子中它将两个中间累积的int加在一起.
但是我不明白为什么第一个例子在没有组合器的情况下编译或者组合器如何解决字符串到int的转换,因为它只是将两个整数加在一起.
任何人都可以阐明这一点吗?
我正在阅读有关Java流和发现新事物的内容.我发现的新事物之一是peek()功能.几乎所有我读过的内容都说它应该用来调试你的Streams.
如果我有一个Stream,每个帐户都有一个用户名,密码字段以及login()和loggedIn()方法,该怎么办?
我也有
Consumer<Account> login = account -> account.login();
Run Code Online (Sandbox Code Playgroud)
和
Predicate<Account> loggedIn = account -> account.loggedIn();
Run Code Online (Sandbox Code Playgroud)
为什么会这么糟糕?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在据我所知,这完全符合它的目的.它;
做这样的事情的缺点是什么?有什么理由我不应该继续吗?最后,如果不是这个解决方案呢?
其原始版本使用.filter()方法如下;
.filter(account -> {
account.login();
return account.loggedIn();
})
Run Code Online (Sandbox Code Playgroud) 在Java中,flush()方法用于流中.但我不明白使用这种方法的目的是什么?
fin.flush();
Run Code Online (Sandbox Code Playgroud)
告诉我一些建议.
我在接受采访时被问到这个问题,我不相信我能给出最好的答案.我提到你可以进行并行搜索,并且通过某些我无法记住的方法处理空值.现在我意识到我在想Optionals.我在这里错过了什么?他们声称它的代码更好或更简洁,但我不确定我是否同意.
考虑到它的回答是多么简洁,看起来这毕竟不是一个问题.
如果他们在面试中提出这个问题,而且显然是这样,除了让更难找到答案之外,还有什么目的可以打破它?我的意思是,你在找什么?我可以打破这个问题并解决所有子问题但是然后创建一个包含所有子项的链接的父问题......虽然看起来很傻.虽然我们在这,但请举一个不太广泛的问题的例子.我知道没有办法只问这个问题的一部分,仍然得到一个有意义的答案.我可以用不同的方式问同一个问题.例如,我可以问"流服务的目的是什么?" 或"我什么时候使用流而不是for循环?" 或"为什么要打扰流而不是循环?" 这些都是完全相同的问题.
......还是被认为过于宽泛,因为有人给出了一个非常长的多点答案?坦率地说,知情人士几乎可以解决任何问题.例如,如果您恰好是JVM的作者之一,那么当我们大多数人不能这样做时,您可能会整天谈论for循环.
"请编辑问题,将其限制在具有足够详细信息的特定问题上,以确定适当的答案.避免同时询问多个不同的问题.请参阅"如何询问"页面以获取有关此问题的帮助.
如下所述,已经给出了足够的答案,证明存在一个并且很容易提供.
java ×10
java-stream ×10
java-8 ×9
arrays ×1
collections ×1
flush ×1
lambda ×1
loops ×1
map ×1
peek ×1
performance ×1