如果有人能解释为什么我不能使用Java中的Stream API比较数组中的String,我将很高兴。
我试图在第一个单词按字典顺序排在第二个单词之前仅过滤对。
String[] input = { "Apple", "Banana" };
Arrays.stream(input)
.filter( (a,b)-> a.compareTo(b)< 0 )
似乎Java并不理解,&#34; b&#34;是一个字符串,但为什么?
答案 0 :(得分:6)
filter
需要Predicate<T>
(或更确切地说,Predicate<? super T>
),其中T
是Stream
元素的类型({{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);
这会在元素之前按字典顺序生成元素索引。
您可以对此流进行进一步操作;但并不完全清楚你期望的结果。