collection.stream()の使い方の詳細

4368 ワード

stream()メソッドとcollect()メソッドはjava 8の新しい特性です.
List widgetIds = widgets.stream().map(Widget::getWidgetId).collect(Collectors.toList());

次の行のコードを説明します:widgets:1つのエンティティクラスの集合、タイプはList Widget:エンティティクラスgetWidgetId:エンティティクラスのgetメソッド、Widgetのidを取得するためにもともとwigetのid集合を取得したいと思っています.私の考えではwidgetを遍歴してwidgetIdsを順番に取得しますが、この行のコードはもっと簡潔で、効率的です.
stream()の利点
ストレージがありません.streamはデータ構造ではなく、あるデータソースのビューにすぎず、データソースは配列、Javaコンテナ、I/O channelなどであってもよい.関数式プログラミングのために生まれた.streamの変更は、streamのフィルタリング操作を実行してもフィルタリングされた要素は削除されず、フィルタリングされた要素を含まない新しいstreamが生成されるなど、背後にあるデータソースは変更されません.惰性実行.stream上の操作はすぐには実行されず、ユーザーが本当に結果を必要とするまで実行されません.消費性.streamは一度だけ「消費」され、一度遍歴すると失効し、容器の反復器のように、再び遍歴するには再生成しなければならない.stream().map()メソッドの使用例:
List list= Arrays.asList("a", "b", "c", "d");
List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect); //[A, B, C, D]
 
List num = Arrays.asList(1,2,3,4,5);
List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(collect1); //[2, 4, 6, 8, 10]

LambdaのCollection Stream Collectionstream()テストエンティティクラス
class Demo {
    private Long id;
    private String name;   
}

//インスタンス化してリストを構成する
List demos = Lists.newArrayList(new Demo(1L, "SF"), new Demo(2L, "AXE"));

1.map+collect用法シーン1:Listリストのすべてのid No Lambdaを取得する
public static List getIds(List demos){
        List ids = Lists.newArrayList();
        for (Demo d : demos) {
            ids.add(d.getId());
        }
        return ids;
}

Lambda’s show
List ids = demos.stream().map(Demo::getId).collect(toList());

最後にtoList()は、例えば、より多くの実装が可能である.
Set ids = demos.stream().map(Demo::getId).collect(toSet());

シーン2:listがmapになるときはlistをmapに変え、複数回のListのO(n)遍歴をMapのO(1)クエリに変え、空間を持って時間を変えるNo lambda
public static Map getIds(List demos){
        Map map = Maps.newHashMap;
        for (Demo d : demos) {
            map.put(d.getId, d);
        }
        return map;
}

Lambda‘s show
 Map map = demos.stream().collect(toMap(Demo::getId, o -> o));

2.filterシーン1:Listからname="SF"のDemoインスタンスを見つける
No lambda
public static Demo getSpecifyDemo(String name, List demos){
    Demo target = null;
    for (Demo demo : demos) {
        if (name.equals(demo.getName())) {
            target = demo;
        }
    }
    return target;
}

Lambda’s show–豪快な老漢カート
String targetName = "SF";
Demo target = demos.stream().filter(d -> targetName.equals(d.getName())).findFirst().orElse(null);

この書き方は非常に簡単ですが、呼び出しチェーンが長すぎて、1つのlambdaが地球を何回も回ることができます.以下のフォーマットに書いたほうがいいです.歩幅が大きすぎないようにします.Lambda’s show–優雅な宣教師
Demo target = demos.stream()
            .filter(d -> targetName.equals.equals(d.getName()))
            .findFirst()
            .orElse(null);

find()の結果はOptional、OptionalはNPEターミネーターと呼ばれ、find()の結果については、orElse()、ifPresent()、isPresent()など、ターミネーターが持っている武器を勝手に使用することができます.
3.match match()はfilter()の略で、返される結果はbooleanタイプのみで、一致するかどうかを返します.
シーン1:現在のリスト内の要素が条件を満たしているかどうかという例では、別の使い方Demo::getId No lambda
List condition = new ArrayList<>();
condition.add("SF");

public static boolean isExist(List condition, List demos){
    boolean flag = false;
    for (Demo demo : demos) {
        if (condition.contains(demo.getName())) {
            flag = true;
            break;
        }
    }
    return flag;
}

Lambda’s show filterの使用
boolean flag = demos.stream()
            .map(Demo::getName)
            .filter(condition::contains)
            .findAny()
            .isPresent();

Lambda’s show直接matchを使用
boolean flag = demos.stream()
            .map(Demo::getName)
            .anyMatch(condition::contains);