徹底的Java8を減らす知ってもらいます

Javaのを学ぶために何の困難はありません

親指アップ、フォーカス、コレクション

1はじめに

  • それは何減らしますか?簡単に言えば、私は正規化の繰り返しである減らすと思います。繰り返しその単純な組み合わせに演算結果を適用することにより、ストリームを受信します。

  • あなたはそれを収集し、比較したい場合は、通常の収集戻りリスト<T>、セット<T>、地図<T> ...が、通常はT(Tは一般的なものではなく、実際には、あなたができるリターンを減らしますこれは、Listクラスのリターン)のいずれかのタイプを含んでいます。

  • この論文では、三つのパラメータ()、平行、非スレッドセーフ、および合成を減少させます。

Optional<T> reduce(BinaryOperator<T> accumulator);

T reduce(T identity,BinaryOperator<T> accumulator);

<U> U  reduce(U identity,BiFunction<U,? super T,U> accumulator,BinaryOperator<U> combiner);

复制代码

2、小規模チョッパー

  • 一つのパラメータを減らします
  • そのうちなど合計、最小、最大は、根本的に削減を実現しています。
/***
* @param: accumulator
* @return:  Optional
*/
Optional<T> reduce(BinaryOperator<T> accumulator);
复制代码
  • 前記BinaryOperator <T>はBiFunction <T、T、T>特殊な場合とみなすことができます。
public class Main {

  public static void main(String[] args) {
  
  
  List<Integer> list = Lists.newArrayList(1,2,3,4,5);
  
  list.stream().reduce( 
        new BinaryOperator<Integer>() {
          @Override
          public Integer apply(Integer integer, Integer integer2) {
            return integer + integer2;
          }
        }));
  
    //=====等价于=====
    System.out.println(IntStream.range(1, 100).reduce((v1, v2) -> v1 + v2).orElse(0));
  //=====等价于=====
    System.out.println(IntStream.range(1, 100).reduce(Integer::sum).orElse(0));
  }
}

integer=1===integer2=2
integer=3===integer2=3
integer=6===integer2=4
integer=10===integer2=5
复制代码

3、その気概を表示します

  • 実際には、パラメータの初期値以上で、2つのパラメータを減らします。ことを指定しますが、最初のイテレーションの最初の引数を減らします。
public class Main {

  public static void main(String[] args) {

    List<Integer> list = Lists.newArrayList(1,2,3,4,5);
    
    //初始值100
    list.stream().reduce(
        100,
        new BinaryOperator<Integer>() {
          @Override
          public Integer apply(Integer integer, Integer integer2) {
            System.out.println("integer="+integer+"===integer2="+integer2);
            return integer + integer2;
          }
        }));
  }
}
//初始值是100,不是1。比没有初始值的reduce多迭代1次。
integer=100===integer2=1
integer=101===integer2=2
integer=103===integer2=3
integer=106===integer2=4
integer=110===integer2=5
复制代码

4、舞い上がります

  • 最初の二つは大きなBOSSである3つのパラメータを減らし、手先です。
  • 私は結論、お話しましょう無用である第三引数ダウン非平行流れを。要素は、ストリームを並列でも並行して行くことはありません指定された場合のみを持っています
  • 三つのパラメータの使用を削減し、必ずスレッドの安全性に注意を払うようになります。
<U> U  reduce(U identity,BiFunction<U,? super T,U> accumulator,BinaryOperator<U> combiner);

复制代码
  • 単純な理解BiFunction、最初のパラメータT、二番目のパラメータUの下で、戻り値はRであります
=====> (T t,U u)-> (R)r  
复制代码
@FunctionalInterface
public interface BiFunction<T, U, R> {

    R apply(T t, U u);

    default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t, U u) -> after.apply(apply(t, u));
    }
}
复制代码
  • デモで見てみましょう(数分でお勧めは、考えて、おそらく完全に理解します)
public static void main(String[] args) {
    ArrayList<Integer> accResult = Stream.of(1, 3, 5, 7)
        .reduce(new ArrayList<>(),
            new BiFunction<ArrayList<Integer>, Integer, ArrayList<Integer>>() {
              @Override
              public ArrayList<Integer> apply(ArrayList<Integer> integers, Integer item) {
                System.out.println("before add: " + integers);
                System.out.println("item= " + item);
                integers.add(item);
                System.out.println("after add : " + integers);
                System.out.println("In BiFunction");
                return integers;
              }
            }, new BinaryOperator<ArrayList<Integer>>() {
              @Override
              public ArrayList<Integer> apply(ArrayList<Integer> integers,
                  ArrayList<Integer> integers2) {
                integers.addAll(integers2);
                System.out.println("integers: " + integers);
                System.out.println("integers2: " + integers2);
                System.out.println("In BinaryOperator");
                return integers;
              }
            });
    System.out.println("accResult: " + accResult);
  }
复制代码
  • 三番目のパラメータの内容にも印刷されませんでしたか?それは第三引数なぜ、ない心配までです
public static void main(String[] args) {
    ArrayList<Integer> accResult = Stream.of(1, 3, 5, 7).parallel()
        .reduce(new ArrayList<>(),
            new BiFunction<ArrayList<Integer>, Integer, ArrayList<Integer>>() {
              @Override
              public ArrayList<Integer> apply(ArrayList<Integer> integers, Integer item) {
                integers.add(item);
                return integers;
              }
            }, new BinaryOperator<ArrayList<Integer>>() {
              @Override
              public ArrayList<Integer> apply(ArrayList<Integer> integers,
                  ArrayList<Integer> integers2) {
                integers.addAll(integers2);
                System.out.println("thread name="+Thread.currentThread().getName()+" ==== integers=" + integers);
                System.out.println("integers2: " + integers2);
                System.out.println("In BinaryOperator");
                return integers;
              }
            });
    //打印结果几乎每次都不同
    System.out.println("accResult: " + accResult);
  }
复制代码
  • より平行よりも、ほとんど常に異なる結果を印刷、バンチヌルがあります。データは私の1,3,5,7-が不完全表示され、すべてではありません。ときの異常が報告されます。

図5に示すように、平行小屋を減らします

  • パラレルフローはスレッド安全性の問題だろうが。我々はArrayListの中で前述したように、非スレッドセーフなクラスで、多くの操作は、予期しない結果につながることができます。

5.1、パラレル基本データ型を削減

 public static void main(String[] args) {
    System.out.println(
        Stream.of(1, 2, 3, 4).parallel().reduce(5, new BiFunction<Integer, Integer, Integer>() {
              @Override
              public Integer apply(Integer integer, Integer integer2) {
                return integer + integer2;
              }
            }
            , new BinaryOperator<Integer>() {
              @Override
              public Integer apply(Integer integer, Integer integer2) {
                return integer + integer2;
              }
            }));
  }
复制代码
  • 図以下:(アキュムレータ番号=ストリーム、コンバイナアキュムレータ数未満です)

5.2、最初の引数は、我々は非常に異なっていると思うかもしれない、その結果、ArrayListにむしろ文字列以外の基本データ型またはオブジェクトである場合。

  • 印刷結果、スレッド名、おそらく意志矛盾しない、ArrayListのスレッドセーフ。(Collections.synchronizedList()が充填要素が少なくない触れた場合)。

  • ルックフォーカスのSystem.out.println(ACC ==項目)各第二アキュムレータとArrayListのような最初のパラメータのパラメータ。

  • 一覧<整数> Collections.synchronizedListへのターン(a)の場合、その順序は必ずしも同じではありませんが、要素が広くなければなりません。

の//概略図

6.まとめ

  • 発表3つのオーバーロード関数は、重点は言った3つのパラメータを減らす減らします。
  • 非平行流アキュムレータ(第3パラメータ)が使用されていない、ストリーム内の要素の数と一致アキュムレータ平行流の数は、ストリーム結合器は以下の要素の数よりも一つです。
  • 並列スレッドセーフフロー、コンバイナArrayListの最初のパラメータは、オブジェクト型である点と相違点の基本的なタイプの下のように記載されています。

おすすめ

転載: juejin.im/post/5e1047565188253a9123cb52