我是Java 8
的初学者,今天我刚开始使用我的第一个lambda
表达式。我有一个String
数组,想在排序前后打印值。以下是我的代码,现在它提供stream has already operated upon or closed
例外,因为我在forEach
上使用了friendsStream
两次。
import java.util.stream.Stream;
class FirstLambda {
public static void main(String [] args){
String [] friends = new String [] {"C","A","B","D"};
Stream<String> friendsStream = Stream.of(friends);
System.out.println("My Friends:-");
printStream(friendsStream);
System.out.println("My Friends (after sort):- ");
Stream<String> sortedFriends = friendsStream.sorted((String m,String n) -> m.compareTo(n));
printStream(sortedFriends);
}
private static void printStream(Stream<String> stream) {
stream.forEach(s->System.out.println(s));
}
}
我的问题是,解决问题的最简单或最好的方法是什么?这是使用java 8
Stream
(即lambda)打印排序前后的字符串值
答案 0 :(得分:3)
当你问“解决我的问题最简单或最好的方法是什么?”时,答案是你根本不需要一个Stream:
String[] friends = {"C", "A", "B", "D"};
System.out.println("My Friends: "+Arrays.toString(friends));
Arrays.sort(friends);
System.out.println("My Friends (after sort): "+Arrays.toString(friends));
请注意,同样适用于Collection API:
List<String> friends = Arrays.asList("C", "A", "B", "D");
System.out.println("My Friends: "+friends);
friends.sort(Comparator.naturalOrder());
System.out.println("My Friends (after sort): "+friends);
如果您想引入Stream API,有几种方法。最简单的:
String[] friends = {"C", "A", "B", "D"};
System.out.println("My Friends: ");
Arrays.stream(friends).forEachOrdered(System.out::println);
System.out.println("My Friends (after sort): ");
Arrays.stream(friends).sorted().forEachOrdered(System.out::println);
请注意,Arrays.stream
是为现有数组构建流的首选方式,该方法也适用于int[]
,long[]
和{{1虽然double[]
是使用 varargs 功能构建具有给定参数的流的规范方法,例如Stream.of
。
我们可以将它用于下一个变体,使用单个流并窥视流:
Stream.of("C", "A", "B", "D")
但请注意Stream.of("C", "A", "B", "D")
.peek(System.out::println)
.sorted()
.forEachOrdered(System.out::println);
主要用于调试Stream处理,因为它允许在处理元素时查看它们。
但是,如果您想了解Stream API,则应避免使用peek
或forEach
,因为所有包含forEachOrdered
/ forEach
的操作最终都只是替代写循环的方式,而不仅仅是一种更复杂的方式。
考虑到实际的预期操作是组成要打印的字符串,更复杂的用法是:
forEachOrdered
答案 1 :(得分:2)
每个Stream
只能有一个终端操作。 forEach
是终端操作,因此每次要使用Stream
时都必须使用单独的printStream
对象。
在排序前使用一个Stream
,在排序后使用另一个Stream
:
import java.util.stream.Stream;
import java.util.Arrays;
public class FirstLambda {
public static void main(String [] args) {
String[] friends = new String[] {"C","A","B","D"};
System.out.println("My Friends:-");
printStream(Arrays.stream(friends));
System.out.println("My Friends (after sort):- ");
printStream(Arrays.stream(friends).sorted());
}
private static void printStream(Stream<?> stream) {
stream.forEach(System.out::println);
}
}