一緒Java8を学ぶために(7) - ストリーム(上)

Java8は、新しい開始からjava.util.stream、このパッケージ内のセット内の要素を処理するためのパッケージ、クラスおよびインタフェースを、ストリームへのインタフェース以下のパッケージには、我々は主にセットを動作させるために、このインターフェイスを使用しています。

ストリームを作成します

まず、いくつかの方法があります作成ストリーム、見てください。

ストリームを生成する静的メソッドを使用してStreamオブジェクトは、次のとおり一般的な静的メソッドが付属しています:

  • Stream.of(T)
  • Stream.of(T ...値)
  • Stream.generate(サプライヤー)
  • Stream.iterate(T、UnaryOperator)
  • Stream.empty()

各静的メソッドは現在役割を見て

Stream.of(T)&Stream.of(T ...値)

Stream.ofは、単一の値、着信の配列を渡し、2つのオーバーロードされた方法で構成されています

String[] arr = {"hello", "world"};
Stream streamArr = Stream.of(arr);

String str = "hello world";
Stream streamSingle = Stream.of(str);复制代码

Stream.generate&Stream.iterate

複数の要素を有するStream.generateストリームStream.iterateを生成するために使用することができる制御されない生成が継続した場合と、それが使用して、典型的には限界(N)であったであろう

Stream.iterate初めて目

Stream<Integer> stream5 = Stream.iterate(0,  n-> n+1)
            .limit(5);
stream5.forEach(System.out::println);复制代码

プリント

0
1
2
3
4复制代码

Stream.iterate方法は、最初のパラメータの初期値を、初期値に基づいて第2パラメータを設定し、各サイクル後に初期値を置き換える新しい値を返します。(5)限界は5サイクルの終わりを示し、最後のストリームは、5つの要素を含みます。

その後Stream.generateを見て

サプライヤーStream.generateのみサイクル当たり1つのパラメータが実行されているサプライヤは、インタフェースメソッドはインターフェース機能サプライヤーであるため、ラムダ式を直接書き込むことができ、ストリームに新たな値を返す手段と

AtomicInteger i = new AtomicInteger();
Stream.generate(()-> {
    return i.getAndIncrement();
})
.limit(5)
.forEach(System.out::println);复制代码

上記のコードは同じ0-4印刷されます。

また、静的メソッドをストリームもCollectionインタフェース・ストリーム・オブジェクトを生成するストリーム()メソッドを使用してもよいです。

Collection<String> list = Arrays.asList("hello", "world");
Stream streamList = list.stream();复制代码

同様に、実装クラスまたはサブクラスCollectionインタフェース限りは、ストリーム()メソッドを使用することができます。

操作ストリーム

一般的に、テーブルの下にまとめ示すストリームの多くの方法があります:

方法 メソッドのパラメータ 戻り値の型 説明
ファイラー 述語 ストリーム データのフィルタリング
明確な ノー ストリーム 重複排除
地図 関数 ストリーム 新しいデータを返します。
flatMap 関数 ストリーム > 新しいデータを返して、平坦化処理を行い
ソート コンパレータ ストリーム データの並べ替え操作
限定 長いです ストリーム 最初のいくつかのデータ傍受
スキップ 長いです ストリーム いくつかのデータをスキップ
anyMatch 述語 ブーリアン 、データのいずれかにマッチし、一致する場合にtrueを返します。
noneMatch 述語 ブーリアン データの一致は、trueを返しますしない場合
allMatch 述語 ブーリアン すべてのデータは、trueを返すために一致した場合
findAny ノー オプショナル 任意のデータを返します
この関数は、FindFirst ノー オプショナル 最初のデータを返します。
カウント ノー 長いです 要素の数を返します。
forEachの 消費者 空隙 要素トラバース、実行コンシューマー
集めます コレクタ R 要素のコレクション
減らします BinaryOperator オプショナル データの概要

この方法は、これらの方法から分かるように、結果は、2つのカテゴリーに分けることができる返し、ストリームのための操作を続けることができる1つの返されたストリームオブジェクトは、そのような方法も呼ばれ中间操作(Intermediate operations)、他方は、ノンリターン・ストリームの終了でありますそのような方法も知られている中端操作(Terminal operations)これら2つの方法を用いて動作する傾向があると、。

ここでは、その役割を発揮することを選択したいくつかの方法があります。

フィルタ

フィルタ法は私たちが望むデータをフィルタリングするために使用され、メソッドのパラメータは、述語は関数インタフェースであるので、我々は書くためにラムダ式を使用することができ述語インタフェースです。

Integer[] arr = { 1, 2, 3, 4, 5 };
long count = Stream.of(arr)
        .filter(i -> i % 2 == 0)
        .count();
System.out.println("偶数数量:" + count);复制代码

この例では、私たちも、数字や統計偶数を選別しました。あなたはすべての偶数を印刷したい場合は、forEachのメソッドを使用することができます

Stream.of(arr)
        .filter(i -> i % 2 == 0)
        .forEach(System.out::println);复制代码

印刷:

2
4复制代码

あなたは、任意の要素を探しているなら、あなたはfindAnyを使用することができます

int num = Stream.of(arr)
        .filter(i -> i % 2 == 0)
        .findAny()
        .orElse(0);
System.out.println("findAny:" + num);复制代码

注、findAny()開発者はデータが見つかりません。自分の状況に対処する必要があるので、データが、見つかりませんでしたがありますので、オプションのオブジェクトを返します。同様にfindFirstまた、オプションのオブジェクトを返します。

明確な

この方法は、SQLと同様の再操作に別個の要素、あろうSELECT distinct xx

Stream.of(1,1,2,3,3,4)
    .distinct()
    .forEach(System.out::println)复制代码

プリント

1
2
3
4复制代码

並べ替え

この方法は、ソート操作エレメントを使用してソートすることができます

Stream.of(6,1,7,2,8,5)
    .sorted()
    .forEach(System.out::println);复制代码

プリント

1
2
5
6
7
8复制代码

あなたは、あなたが使用することができますしたい場合はソート()デフォルトでは降順で最大から最小まで、昇順ています.sorted(Comparator.reverseOrder())

Stream.of(6,1,7,2,8,5)
    .sorted(Comparator.reverseOrder())
    .forEach(System.out::println);复制代码

見ることができ、ソート方法を使用すると、コンパレータを渡すことができComparator、開発者が独自のソート・ロジックを実装することができます。以下は、カスタムコンパレータの一例です:

@Data
@AllArgsConstructor
static class Goods {
    private String goodsName;
    private int price;
}

Stream.of(
        new Goods("iphoneX", 4000)
        , new Goods("mate30 pro", 5999)
        , new Goods("redmek20", 2999)
        )
.sorted((goods1, goods2) -> {
    return Integer.compare(goods1.getPrice(), goods2.getPrice());
})
.forEach(System.out::println);复制代码

この列子は、最低から最高の商品価格によって証明されました。ソートされた部分は、ここのように簡略化することができます。.sorted(Comparator.comparing(Goods::getPrice))

地図

この方法は、新しいストリームからなる、マップに新しいデータオブジェクトを返すことができます。

List<Goods> list = Arrays.asList(
        new Goods("iphoneX", 4000)
        , new Goods("mate30 pro", 5999)
        , new Goods("redmek20", 2999)
        );
list.stream()
    .map(goods -> goods.getGoodsName())
    .forEach(System.out::println);复制代码

オリジナル商品の商品名オブジェクトから取得し、新しいリストを形成するために、上の例では、その効果は同等です

List<String> goodsNameList = new ArrayList<>(list.size());
for(Goods goods : list) {
    goodsNameList.add(goods.getGoodsName());
}复制代码

一般マップと一緒に使用される方法は、()メソッドを収集します

List<Goods> list = Arrays.asList(
        new Goods("iphoneX", 4000)
        , new Goods("mate30 pro", 5999)
        , new Goods("redmek20", 2999)
);
List<String> nameList = list.stream()
        .map(goods -> goods.getGoodsName())
        .collect(Collectors.toList());复制代码

collect(Collectors.toList())リスト内の要素の変換手段ストリーム

flatMap

flatMap()メソッドは、プロセスマップ()メソッドを平坦化され、マップが異なる、ストリームオブジェクト戻り、自分のオペレータに対処するための現像剤をflatMap。以下の例を参照してください。

Stream<String[]> stream = Stream.of("I am Java", "hello world")
        .map(s -> s.split(" "));复制代码

この例では、マップは、文字列の配列を返すので、各文字列、単独ストリームに単語を分割するように意図されているString[]ので、汎用パラメータ・ストリーム・オブジェクトを取得し、その代わりStream Stream

解決策は、flatMap使用することです。

Stream<String> stream2 = Stream.of("I am Java", "hello world")
                .flatMap(s -> Stream.of(s.split(" ")));
stream2.forEach(System.out::println);复制代码

印刷:

I
am
Java
hello
world复制代码

総合的な例

関数がある実証包括的な例を見てみましょう:查询商品名称,价格大于3000,按价格降序

public class StreamTest3 {
    @Data
    @AllArgsConstructor
    static class Goods {
        private String goodsName;
        private int price;
    }

    public static void main(String[] args) {
        List<Goods> list = Arrays.asList(
                new Goods("iphoneX", 4000)
                , new Goods("mate30 pro", 5999)
                , new Goods("redmek20", 2999)
        );
        // 查询商品名称,价格大于3000,按价格降序
        List<String> nameList = list.stream()
                .filter(goods -> goods.getPrice() > 3000)
                .sorted(Comparator.comparing(Goods::getPrice).reversed())
                .map(Goods::getGoodsName)
                .collect(Collectors.toList());
        System.out.println(nameList);
    }
}复制代码

印刷:[mate30 pro, iphoneX]

に対応するSQLコード:

SELECT goods_name FROM goods WHERE price > 3000 ORDER BY price DESC复制代码

概要

Benpianは、私たちが説明し、次のいずれかに焦点を当てる、ストリームストリームの一部を作成し、一般的な方法を使用する方法について説明collect()し、reduce()使用方法。

技術を共有するために定期的にドライ品、一緒に学び、一緒に進行!

おすすめ

転載: juejin.im/post/5db7c7a351882564775e1e3b