[Java 8 新機能] オブジェクトリスト内の属性のリストを取得する

オブジェクトリスト内のプロパティのリストを取得します。

1. 使用例

リスト内のすべてのオブジェクトのプロパティを取得します

List<UserEntity> users = new ArrayList<>();
users.add(new UserEntity(1,"张三","18399990000"));
List<String> courseIds =  users.stream().map(UserEntity::getUserName).collect(Collectors.toList());

2. 具体的な事例

ユーザーエンティティ.java

import java.io.Serializable;

/**
 * @author: shipleyleo
 * @create: 2023-06-03 15:22:54
 */
public class UserEntity implements Serializable {
    
    
    private Integer id;
    private String userName;
    private String phone;

    public UserEntity(Integer id, String userName, String phone) {
    
    
        this.id = id;
        this.userName = userName;
        this.phone = phone;
    }

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getUserName() {
    
    
        return userName;
    }

    public void setUserName(String userName) {
    
    
        this.userName = userName;
    }

    public String getPhone() {
    
    
        return phone;
    }

    public void setPhone(String phone) {
    
    
        this.phone = phone;
    }
}

テスト.java

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: shipleyleo
 * @create: 2023-06-03 15:51:03
 */
public class Test {
    
    
    public static void main(String args[]){
    
    
        List<UserEntity> users = new ArrayList<>();
        users.add(new UserEntity(1,"张三","18399990000"));
        users.add(new UserEntity(2,"王五","18399990023"));
        users.add(new UserEntity(3,"里斯","18399990005"));
        // 获取list中所有对象的某个属性
        List<String> courseIds =  users.stream().map(UserEntity::getUserName).collect(Collectors.toList());
        System.out.println(courseIds); //[张三, 王五, 里斯]
    }
}

出力結果:
ここに画像の説明を挿入

付録: Java 8 Stream の基本的な使用法

1. Java 8 Stream の基本概要

Java 8 API には、stream Stream と呼ばれる新しい抽象化が追加されており、宣言的な方法でデータを処理できるようになります。

Stream は、SQL ステートメントを使用してデータベースからデータをクエリするのと同様の直感的な方法で、Java のコレクション操作と表現の高レベルの抽象化を提供します。

Stream API を使用すると、Java プログラマーの生産性が大幅に向上し、効率的でクリーンで簡潔なコードを作成できるようになります。

このスタイルは、要素のコレクションをストリームとして処理するものとみなし、パイプライン内で送信され、フィルタリング、並べ替え、集計などのパイプラインのノードで処理できます。

要素フローはパイプラインの中間操作で処理され、最後に最終操作で前の処理の結果が得られます。

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

上記のプロセスは次のように Java コードに変換されます。

List<Integer> transactionsIds = 
widgets.stream()
             .filter(b -> b.getColor() == RED)
             .sorted((x,y) -> x.getWeight() - y.getWeight())
             .mapToInt(Widget::getWeight)
             .sum();


2. ストリームの生成

Java 8 では、コレクション インターフェイスにストリームを生成する 2 つのメソッドがあります。

  • stream() -コレクションのシリアルストリームを作成します。
  • ParallelStream() -コレクションの並列ストリームを作成します。

1、地図

各要素を対応する結果にマップするには、map メソッドが使用されます。次のコード スニペットは、map を使用して、要素に対応する平方数を出力します。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

2、フィルター

filter メソッドは、条件を設定して要素を除外するために使用されます。次のコード スニペットでは、filter メソッドを使用して空の文字列を除外します。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.stream().filter(string -> string.isEmpty()).count();

3、それぞれ

Stream には、ストリーム内の各項目を反復処理するための新しいメソッド 'forEach' が用意されています。次のコード スニペットは、forEach を使用して 10 個の乱数を出力します。

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

4、制限

limit メソッドは、指定された数のストリームを取得するために使用されます。次のコード スニペットでは、limit メソッドを使用して 10 個のデータを出力します。

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

5、並べ替え

ストリームをソートするには、sorted メソッドが使用されます。次のコード スニペットでは、sorted メソッドを使用して 10 個の乱数の出力を並べ替えます。

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

6. 並列プログラム

ParallelStream は、ストリーム並列ハンドラーの代替です。次の例では、ParallelStream を使用して空の文字列の数を出力します。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

順次実行と並列実行を簡単に切り替えることができます。

7、コレクター

Collectors クラスは、ストリームのコレクションへの変換や要素の集約など、多くのリダクション操作を実装します。コレクターを使用してリストまたは文字列を返すことができます。

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
 
System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

8. 統計

さらに、統計結果を生成するいくつかのコレクターも非常に役立ちます。これらは主に int、double、long などの基本的な型で使用され、次のような統計結果を生成するために使用できます。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
 
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
 
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

参考文献

おすすめ

転載: blog.csdn.net/Shipley_Leo/article/details/131022164