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



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

当第一个单词在第二个词典顺序之前时,我试图仅过滤对。

String[] input = { "Apple", "Banana" };
    Arrays.stream(input)
            .filter( (a,b)-> a.compareTo(b)< 0 )

Java似乎不明白,"b"是一个字符串,但为什么呢?

filter需要一个Predicate<T>(或者更准确地说,Predicate<? super T>),其中TStream元素的类型(在您的情况下String)。

(a,b)-> a.compareTo(b)< 0不能解释为Predicate<T>,因为Predicateboolean test(T t)方法只接受一个参数,而不是两个。

filter分别应用于Stream的每个元素。您的Stream中没有对.

如果您有更多货币对要比较,这可能会有所帮助:

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]

希望它能帮助您解决问题。

如果你想比较对,你需要以某种方式自己"制作"对,例如

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);

这将在元素的下一个元素之前按字典顺序生成元素的索引。

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

相关内容

  • 没有找到相关文章

最新更新