Java Stream API比较数组中的字符串

时间:2017-10-15 12:14:34

标签: java string filter compare java-stream

如果有人能解释为什么我不能使用Java中的Stream API比较数组中的String,我将很高兴。

我试图在第一个单词按字典顺序排在第二个单词之前仅过滤对。

String[] input = { "Apple", "Banana" };

    Arrays.stream(input)
            .filter( (a,b)-> a.compareTo(b)< 0 )

似乎Java并不理解,&#34; b&#34;是一个字符串,但为什么?

3 个答案:

答案 0 :(得分:6)

filter需要Predicate<T>(或更确切地说,Predicate<? super T>),其中TStream元素的类型({{1}在你的情况下)。

String无法解释为(a,b)-> a.compareTo(b)< 0,因为Predicate<T>的{​​{1}}方法只需要一个参数,而不是两个参数。

Predicate分别应用于boolean test(T t)的每个元素。您的filter中没有配对。

答案 1 :(得分:3)

如果你有更多的对要比较,这可能是一个帮助:

public class Main {

    public static void main(String[] args) {

        String[][] input = {{ "Apple", "Banana" }, 
                            {"Orange", "Apple"}, 
                            {"Banana", "Orange"}};

        Arrays.stream(input)
                   .filter(x -> x[0].compareTo(x[1]) < 0)
                   .forEach(x -> System.out.println(Arrays.toString(x)));

    }

}

现在输出应该如下:

[Apple, Banana]
[Banana, Orange]

希望它可以帮助您解决问题。

答案 2 :(得分:1)

如果你想比较对,你需要&#34;制作&#34;以某种方式对自己,例如。

IntStream indexes =
    IntStream.range(0, input.length-1)
                // Via i you implicitly have access to the pair
                // (input[i], input[i+1])
        .filter(i -> input[i].compareTo(input[i+1]) < 0);

这会在元素之前按字典顺序生成元素索引。

您可以对此流进行进一步操作;但并不完全清楚你期望的结果。