【问题标题】:Java Stream API comparing Strings in an arrayJava Stream API 比较数组中的字符串
【发布时间】:2017-10-15 12:14:33
【问题描述】:

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

我试图只过滤第一个单词在第二个单词之前的字典。

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

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

Java好像不明白,“b”是String,但是为什么呢?

【问题讨论】:

  • 因为流不会变魔术。

标签: java string filter compare java-stream


【解决方案1】:

filter 需要 Predicate&lt;T&gt;(或更准确地说,Predicate&lt;? super T&gt;),其中 TStream 元素的类型(在您的情况下为 String)。

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

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

【讨论】:

    【解决方案2】:

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

    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]
    

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

    【讨论】:

    • 转念一想这可能正是他想要的。
    • 是的,这可能是误解......但是他写了关于过滤“对”的文章,所以我认为这些对是从更大的东西中过滤掉的,他只能处理一对里面的条件.无论如何,这是我的第一个答案,您之前写的内容是一个宝贵的提示,谢谢;)
    【解决方案3】:

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

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

    这会在其后一个元素之前按字典顺序生成元素的索引。

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

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2012-02-14
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多