どのようにJavaの8ソートされたストリームの中カントーアクセス前の項目?

BetaRide:

ソートされたストリームでは、私は前の要素にアクセスしたいと思います。

私はこのような何かを探しています:

class Main {
  public static void main(String[] args) {
    List<String> stringList = Arrays.asList("1: First", "2: Second", "3: Third", "4: Fourth");

    List<String> resultList = stringList.stream()
      .sorted()
      .filter(s -> s.contains("Second") && s.previous().contains("First"))
                                           ^^^^^^^^^^^^ doesn't compile
      .collect(Collectors.toList());

    System.out.println(resultList);
  }
}

この場合、予想される出力は、

Second

重要:私は中ラムダ外要因たいのですがfilter()別の場所でそれを再利用する方法。

yelliver:

あなたは前にすべてのステップを保存することができます:

class Main {
    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("1: First", "2: Second", "3: Third", "4: Fourth");
        List<String> resultList = stringList.stream()
                .sorted()
                .filter(new Predicate<String>() {
                    private String prev = null;

                    @Override
                    public boolean test(String s) {
                        boolean result = s.contains("Second") && prev != null && prev.contains("First");
                        prev = s;
                        return result;
                    }
                })
                .collect(Collectors.toList());
        System.out.println(resultList);
    }
}

そして、あなたは再利用のために分離するカスタム述語のクラスを定義することができます。

class Main {
    public static void main(String[] args) {
        List<String> stringList = Arrays.asList("1: First", "2: Second", "3: Third", "4: Fourth");
        List<String> resultList = stringList.stream()
                .sorted()
                .filter(new WithPrevPredicate() {
                    @Override
                    public boolean test(String prev, String current) {
                        return current.contains("Second") && prev != null && prev.contains("First");
                    }
                })
                .collect(Collectors.toList());
        System.out.println(resultList);
    }

    private static abstract class WithPrevPredicate<T> implements Predicate<T> {
        private T prev = null;

        @Override
        public boolean test(T current) {
            boolean test = test(prev, current);
            prev = current;
            return test;
        }

        public abstract boolean test(T prev, T current);
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=234558&siteId=1