JDK8でのStreamAPIの一般的な使用法について

ストリームAPI

データソースとは関係のない新しいストリームを生成します(データソースは影響を受けません)

a)ストリームメソッドの作成:

1)コレクション例如:new ArrayList <>()。stream()

2)Arrays.stream()

3)Streamクラスの()の静的メソッドを介して

4)無限のストリームを作成する

//创建无线流 — 迭代方式
@Test
public void test1() {
    
    
	Stream<Integer> stream = Stream.iterate(0,(x) -> x+2);
	stream.limit(10).forEach(System.out::println);
}
//创建无线流  ——生成
	@Test
	public void test2() {
    
    
		Stream.generate(() ->Math.random()).limit(5).forEach(System.out::println);
	}

b)中間操作

1)スクリーニングとスライス

フィルタ-Lambdaを受け取り、ストリームから特定の要素を除外します。

@Test
public void test3() {
    
    //stream有内部迭代
	//中间操作
	Stream<Employee> stream = emplpoyees.stream().filter((e) ->{
    
    //filter就是中间操作
		System.out.println("开始执行判断");
		return e.getAge()>35;
	});
	/**
	终止操作:一次性执行全部内容,就是“惰性求值”;
	例如:在没有进行终止操作的情况下所有的中间操作都不会执行,只有当执行了终止操作,中间操作才会全部一次性执行!!
	**/
	stream.forEach(System.out::println);//打印就是终止操作!
}

制限-要素が指定された数を超えないようにフローを切り捨てます

@Test
public void test3() {
    
    
	//中间操作
	Stream<Employee> stream = emplpoyees.stream().filter((e) ->{
    
    
		System.out.println("开始执行判断");
		return e.getAge()>35;
	}).limit(1).forEach(System.out::println);//限制为1条
}

skip(n)-要素をスキップします。たとえば、セットには5つの要素があります。Skip(2)は最初の2つをスキップし、最後の3つを残します。ストリームに要素がn未満の場合、空のストリームが返されます。limit(n)を補完する

明確な-フィルタリング(重複排除)、ストリームによって生成された要素hashcode()およびequals()を介して重複要素を削除します

2)地図

map-ラムダを受信したり、要素を他の形式に変換したり、情報を抽出したりします。関数をパラメーターとして受け取ると、関数は各要素に適用され、新しい要素にマップされます。

flatMap-関数をパラメーターとして受け取り、ストリーム内の各値を別のストリームに置き換えてから、すべてのストリームを1つのストリームに接続します。

//映射
@Test
public void test4() {
    
    
	emplpoyees.stream().map(Employee::getName).forEach(System.out::println);
	}

3)並べ替え

sort():自然ソート(比較可能)

@Test
	public void test5() {
    
    
		List<String> list1 = Arrays.asList("bbb","ccc","aaa","ddd");
		list1.stream().sorted().forEach(System.out::println);
	}

ソート済み(コンパレータcom):カスタムソート

c)操作を終了します

以下は、操作を終了するために一般的に使用される方法です。

​	allMatch

​	anyMatch

​	noneMatch

​	findFirst

​	findAny

​	count

​	max

​	min

d)制定法

reduce(T identity、BinaryOperator)/ reduce(BinaryOperator)は、ストリーム内の要素を繰り返し組み合わせて値を取得できます。

@Test
public void test1() {
    
    
	List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
	// T reduce(T identity, BinaryOperator<T> accumulator);
	Integer sum = list.stream().reduce(0, (x,y) -> x+y);
	System.out.println(sum);//55
    
    //需求:获取员工类中的所有工资的总和(map-reduce规约实现)
    Optional<Double> op = emplpoyees.stream().map(Employee::getSarlary).reduce(Double::sum);
		System.out.println(op.get());
}

e)コレクション

collect-ストリームを他の形式に変換します。ストリーム内の要素を要約するために使用されるコレクターインターフェイスの実装を受け取ります

//需求:将员工类中的所有名字收集到集合list中
public void test2() {
    
    
    /**
    	Employee::getName(方法引用的第三种方式————类::实例方法名);实例方法就是非静态方法
    	Collectors这是一个集合收集的工具类,里边包含了许多静态方法
    */
	List<String> list = emplpoyees.stream().map(Employee::getName).collect(Collectors.toList());
	list.forEach(System.out::println);
}
//set实现上一个需求(set可以将员工集合中的重复名字的员工去重)
@Test
public void test3() {
    
    
	Set<String> set = emplpoyees.stream().map(Employee::getName).collect(Collectors.toSet());
	set.forEach(System.out::println);
}
//
@Test
public void test4() {
	Long count = emplpoyees.stream().collect(Collectors.counting());
	System.out.println(count);
	
	Double avg = emplpoyees.stream().collect(Collectors.averagingDouble(Employee::getSarlary));
	System.out.println(avg);
	
	Double sum = emplpoyees.stream().collect(Collectors.summingDouble(Employee::getSarlary));
	System.out.println(sum);
}

上記の収集メソッドに加えて、groupingBy(マルチレベルのグループ化)、partitioningBy(partitioning)、joining(joining)などのメソッドがあります。APIドキュメントは、要件に応じてクエリできます。

おすすめ

転載: blog.csdn.net/weixin_45496190/article/details/106970254