如果有人能解释为什么我不能使用 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>
),其中T
是Stream
元素的类型(在您的情况下String
)。
(a,b)-> a.compareTo(b)< 0
不能解释为Predicate<T>
,因为Predicate
的boolean 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);
这将在元素的下一个元素之前按字典顺序生成元素的索引。
您可以对此流执行进一步的操作;但并不完全清楚您期望的结果。