我的同事和我有一个错误是由于我们假设空流调用allMatch()将返回false.
if (myItems.allMatch(i -> i.isValid()) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
当然,假设而不是阅读文档是我们的错.但我不明白为什么allMatch()空流的默认行为返回true.这是什么原因?就像anyMatch()(相反地返回false)一样,这个操作以一种离开monad并且可能在if声明中使用的命令性方式使用.考虑到这些事实,是否有任何理由为什么在大多数用途中需要allMatch()默认为true空流?
想象一下,我有一些特定对象的列表:
List<Student>
Run Code Online (Sandbox Code Playgroud)
我需要生成包含另一个列表ids的Students在上面的列表:
List<Integer>
Run Code Online (Sandbox Code Playgroud)
避免使用循环,是否可以通过使用apache集合或番石榴来实现这一点?
哪种方法对我的情况有用?
我试图在下面的Collectors.toMap()调用中为"keyMapper"函数参数提供一个更简洁的表达式:
List<Person> roster = ...;
Map<String, Person> map =
roster
.stream()
.collect(
Collectors.toMap(
new Function<Person, String>() {
public String apply(Person p) { return p.getLast(); }
},
Function.<Person>identity()));
Run Code Online (Sandbox Code Playgroud)
似乎我应该能够使用lambda表达式来内联它,但我无法想出一个编译它的人.(我对lambdas很新,所以这并不奇怪.)
谢谢.
- >更新:
如接受的答案所述
Person::getLast
Run Code Online (Sandbox Code Playgroud)
是我在寻找的东西,也是我尝试过的东西.然而,Eclipse 4.3的BETA_8每晚构建是问题 - 它标记为错误.从命令行编译时(我应该在发布之前完成),它起作用了.所以,是时候用eclipse.org提交bug了.
谢谢.
我有以下情况
Map<Key, ListContainer> map;
public class ListContainer{
List<AClass> lst;
}
Run Code Online (Sandbox Code Playgroud)
我已经合并所有列表lst从ListContainer从对象Map地图.
public static void main(String args[]){
List<AClass> alltheObjectsAClass = map.values().stream(). // continue....
}
Run Code Online (Sandbox Code Playgroud)
任何想法,使用Java 8流API?
Stream没有last()方法:
Stream<T> stream;
T last = stream.last(); // No such method
Run Code Online (Sandbox Code Playgroud)
获取最后一个元素的最优雅和/或最有效的方法是什么(空流为null)?
我知道这些方法的执行顺序不同,但在我的所有测试中,我都无法实现不同的顺序执行.
例:
System.out.println("forEach Demo");
Stream.of("AAA","BBB","CCC").forEach(s->System.out.println("Output:"+s));
System.out.println("forEachOrdered Demo");
Stream.of("AAA","BBB","CCC").forEachOrdered(s->System.out.println("Output:"+s));
Run Code Online (Sandbox Code Playgroud)
输出:
forEach Demo
Output:AAA
Output:BBB
Output:CCC
forEachOrdered Demo
Output:AAA
Output:BBB
Output:CCC
Run Code Online (Sandbox Code Playgroud)
请提供两种方法产生不同输出的示例.
我试图列出整数列表中的重复元素,例如,
List<Integer> numbers = Arrays.asList(new Integer[]{1,2,1,3,4,4});
Run Code Online (Sandbox Code Playgroud)
使用jdk的Streams 8.有没有人试过.要删除重复项,我们可以使用distinct()api.但是如何找到重复的元素呢?有人可以帮帮我吗?
我创建一个Map从List如下:
List<String> strings = Arrays.asList("a", "bb", "ccc");
Map<String, Integer> map = strings.stream()
.collect(Collectors.toMap(Function.identity(), String::length));
Run Code Online (Sandbox Code Playgroud)
我希望保持与之相同的迭代顺序List.如何创建LinkedHashMap使用Collectors.toMap()方法?
我有以下示例代码:
System.out.println(
"Result: " +
Stream.of(1, 2, 3)
.filter(i -> {
System.out.println(i);
return true;
})
.findFirst()
.get()
);
System.out.println("-----------");
System.out.println(
"Result: " +
Stream.of(1, 2, 3)
.flatMap(i -> Stream.of(i - 1, i, i + 1))
.flatMap(i -> Stream.of(i - 1, i, i + 1))
.filter(i -> {
System.out.println(i);
return true;
})
.findFirst()
.get()
);
Run Code Online (Sandbox Code Playgroud)
输出如下:
1
Result: 1
-----------
-1
0
1
0
1
2
1
2
3
Result: -1
Run Code Online (Sandbox Code Playgroud)
从这里我看到,在第一种情况下stream真的表现得懒惰 - 我们使用findFirst()所以一旦我们有第一个元素我们的过滤lambda没有被调用.然而,在使用flatMaps的第二种情况下,我们看到尽管找到满足过滤条件的第一个元素(它只是任何第一个元素,因为lambda总是返回true),流的其他内容仍然通过过滤函数被馈送.
我试图理解为什么它表现得像这样,而不是在第一个元素计算后放弃,如第一种情况.任何有用的信息将不胜感激.
我有兴趣从流中排序列表.这是我正在使用的代码:
list.stream()
.sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?该列表没有排序.
它应该根据具有最低值的项目对列表进行排序.
for (int i = 0; i < list.size(); i++)
{
System.out.println("list " + (i+1));
print(list, i);
}
Run Code Online (Sandbox Code Playgroud)
和打印方法:
public static void print(List<List> list, int i)
{
System.out.println(list.get(i).getItem().getValue());
}
Run Code Online (Sandbox Code Playgroud) java ×10
java-stream ×10
java-8 ×8
lambda ×4
collections ×3
list ×3
foreach ×1
guava ×1
sorting ×1