流 - 在排序之前和之后打印值

时间:2016-09-20 16:15:11

标签: string sorting java-8 java-stream

我是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)打印排序前后的字符串值

2 个答案:

答案 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,则应避免使用peekforEach,因为所有包含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);
    }
}

Ideone Demo