注意:这个问题源于一个死链接,这是以前的SO问题,但是这里......
看到这个代码(注意:我不知道,这个代码将不能"工作",而Integer::compare应使用-我只是提取它从链接的问题):
final ArrayList <Integer> list
= IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());
System.out.println(list.stream().max(Integer::max).get());
System.out.println(list.stream().min(Integer::min).get());
Run Code Online (Sandbox Code Playgroud)
据javadoc的.min()和.max(),两者的参数应该是一个Comparator.然而,这里的方法引用是Integer类的静态方法.
那么,为什么要编译呢?
有时您想要Stream使用多个条件过滤a :
myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...
Run Code Online (Sandbox Code Playgroud)
或者你可以用复杂的条件和单一的方式 做同样的事情filter:
myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...
Run Code Online (Sandbox Code Playgroud)
我的猜测是第二种方法具有更好的性能特征,但我不知道.
第一种方法在可读性方面取胜,但性能更好?
我正在尝试使用Java 8 Stream来查找a中的元素LinkedList.但是,我想保证过滤条件只有一个匹配.
拿这个代码:
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
Run Code Online (Sandbox Code Playgroud)
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) …Run Code Online (Sandbox Code Playgroud) 我刚刚发现了新的Java 8流功能.来自Python,我想知道现在是否有一种简洁的方法可以对数组进行操作,例如求和,以"一行pythonic"方式将两个数组相乘?
谢谢
我知道如何List从Y- > "转换"一个简单的Java Z,即:
List<String> x;
List<Integer> y = x.stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在我想用Map做基本相同的事情,即:
INPUT:
{
"key1" -> "41", // "41" and "42"
"key2" -> "42 // are Strings
}
OUTPUT:
{
"key1" -> 41, // 41 and 42
"key2" -> 42 // are Integers
}
Run Code Online (Sandbox Code Playgroud)
解决方案不应限于String- > Integer.就像List上面的例子一样,我想调用任何方法(或构造函数).
是否有Java 8流操作限制(可能是无限的)Stream直到第一个元素无法匹配谓词?
在Java 9中,我们可以使用takeWhile下面的示例来打印小于10的所有数字.
IntStream
.iterate(1, n -> n + 1)
.takeWhile(n -> n < 10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
由于Java 8中没有这样的操作,以一般方式实现它的最佳方法是什么?
Java 8中有许多有用的新东西.例如,我可以在一个对象列表上迭代一个流,然后对来自Object实例的特定字段的值求和.例如
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Run Code Online (Sandbox Code Playgroud)
因此,我问是否有任何方法可以构建一个String连接toString()方法的输出与单行中的实例.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Run Code Online (Sandbox Code Playgroud)
假设list包含整数1,2并且3我希望它concatenated是"123"或"1,2,3".
我正在玩Java SE 8中的惰性函数操作,我想要一个对/元组map的索引,然后基于第二个元素,最后只输出索引.i(i, value[i])filtervalue[i]
我是否仍然要忍受这个问题:Java中的C++ Pair <L,R>相当于什么?在lambdas和溪流的大胆新时代?
更新:我提供了一个相当简化的示例,其中有一个由@dkatzel提供的简洁解决方案,其中一个答案如下.但是,它没有概括.因此,让我添加一个更一般的例子:
package com.example.test;
import java.util.ArrayList;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
boolean [][] directed_acyclic_graph = new boolean[][]{
{false, true, false, true, false, true},
{false, false, false, true, false, true},
{false, false, false, true, false, true},
{false, false, false, false, false, true},
{false, false, false, false, false, true},
{false, false, false, false, false, false}
};
System.out.println(
IntStream.range(0, …Run Code Online (Sandbox Code Playgroud) 我有一个列表myListToParse,我想过滤元素并在每个元素上应用一个方法,并将结果添加到另一个列表中myFinalList.
使用Java 8,我注意到我可以通过两种不同的方式完成它.我想知道他们之间更有效的方式,并理解为什么一种方式比另一种更好.
我对任何有关第三种方式的建议持开放态度.
方法1:
myFinalList = new ArrayList<>();
myListToParse.stream()
.filter(elt -> elt != null)
.forEach(elt -> myFinalList.add(doSomething(elt)));
Run Code Online (Sandbox Code Playgroud)
方法2:
myFinalList = myListToParse.stream()
.filter(elt -> elt != null)
.map(elt -> doSomething(elt))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud) 在Java 8中,Stream.collect允许对集合进行聚合.在Kotlin中,除了作为stdlib中的扩展函数的集合之外,它不以相同的方式存在.但目前尚不清楚不同用例的等价性.
例如,在JavaDocCollectors的顶部是为Java 8编写的示例,当将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此它们应该以不同的方式编写.
在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,并没有真正与相同的用例进行比较.什么是真正符合Java 8记录的案例的好例子Stream.collect?那里的清单是:
以上链接的JavaDoc中的详细信息.
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.
java-8 ×10
java-stream ×10
java ×9
lambda ×3
arrays ×1
collections ×1
collectors ×1
filter ×1
kotlin ×1
mapreduce ×1