Java8 Stream生成流 generate iterate IntStream

本文详细介绍了Java Stream API的generate()和iterate()方法,涵盖了随机数生成、等差数列、实体类实例化、数组生成及复杂属性赋值。通过实例演示如何高效创建和操作一系列对象,适合深入理解Stream的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


❗❗❗Stream.generate和Stream.iterate()都要配合.limit()来使用,确保生成的元素的数量


一.Stream.generate()

1.1 生成实体类对象List

⏹生成Person对象List

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    private String id;

    private String email;

    private List<House> houseList;
}

// 生成4个无参构造Person对象
List<Person> personList = Stream.generate(Person::new)
	.limit(4)
	.collect(Collectors.toList());
System.out.println(personList);

1.2 生成5个0到指定范围内的随机整数

⏹生成5个范围在0到20的整数,nextInt(20)表示[0,20),不包含20,因此需要 +1

List<Integer> list2 = Stream.generate(() -> new Random().nextInt(20) + 1)
			.limit(5)
			.collect(Collectors.toList());
System.out.println(list2);  // [10, 5, 8, 16, 18]

1.3 生成指定5个范围内的随机整数

⏹生成区间 [64,128] 中随机值
指定范围内的取值公式 : new Random().nextInt(MAX - MIN + 1) + MIN;

final int[] intArray1 = IntStream
	.generate(() -> new Random().nextInt(128 - 64 + 1) + 64)
	.limit(5)
	.toArray();
System.out.println(Arrays.toString(intArray1));  // [96, 83, 119, 71, 73]

1.4 生成5个随机三位数

⏹随机生成5个3位整数

final int[] intArray2 = IntStream
	.generate(() -> new Random().nextInt(900) + 100)
	.limit(5)
	.toArray();
System.out.println(Arrays.toString(intArray2));  // [457, 328, 454, 965, 501]

二.Stream.iterate()

iterate 跟 reduce 操作很像

2.1 生成等差数列

⏹生成5个从0开始的等差数列元素

List<Integer> list3 = Stream
	.iterate(0, n -> n + 3)
	.limit(5)
	.collect(Collectors.toList());
System.out.println(list3);  // [0, 3, 6, 9, 12]

2.2 生成空字符串List

⏹生成一个包含5个空字符串的List集合

final List<String> list4 = Stream
	.iterate("", item -> item)
	.limit(5)
	.collect(Collectors.toList());
System.out.println(list4);  // [, , , , ]

三.IntStream.rangeClosed()

3.1 生成指定范围内的数组

⏹生成一个从1到10的数组 [start, end]

final int[] ints1 = IntStream.rangeClosed(1, 10).toArray();
System.out.println(Arrays.toString(ints1));
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

⏹生成一个从1到9的数组 [start, end)

final int[] ints2 = IntStream.range(1, 10).toArray();
System.out.println(Arrays.toString(ints2));
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

3.2 递增生成姓名List

List<String> names = IntStream.rangeClosed(1, 4)
	.mapToObj(i -> "姓名" + i)
	.collect(Collectors.toList());
System.out.println(names);  // [姓名1, 姓名2, 姓名3, 姓名4]

3.3 生成有参构造实体类List

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    private String id;

    private String email;

    private List<House> houseList;
}
// 生成4个Person对象,并指定对象的id
List<Person> personList2 = IntStream.rangeClosed(1, 4)
		.mapToObj(item -> new Person(String.valueOf(item), "", new ArrayList<>()))
		.collect(Collectors.toList());
System.out.println(personList2);

3.4 生成实体类对象List,并指定实体类内的属性对象值

// 生成4个Person对象,每个Person对象中都包含houseList
List<Person> personList3 = IntStream.rangeClosed(1, 4)
		// 创建Person对象
		.mapToObj(item -> new Person(String.valueOf(item), "", new ArrayList<>()))
		/*
		 * ❗此处不能使用map,map会将Person中的HouseList获取出来,但是无法向HouseList中添加House对象
		 * 使用peek操作流,流中的元素没有改变.相当于将每一个House对象放入HouseList中
		 */
		.peek(item -> IntStream.range(1, 4)
				// 生成4个House对象
				.mapToObj((i) -> new House(String.valueOf(i), ""))
				// 将House对象放入Person对象中
				.forEach(item.getHouseList()::add)
		).collect(Collectors.toList());

⏹使用flatMap展平所有的House

List<String> houseIdList1 = personList3
		// 使用并行流,无需在意顺序
		.parallelStream()
		// 获取出所有的HouseList,并将其展平为 List<House>
		.flatMap(item -> item.getHouseList().stream())
		// 将House流中的Id获取出来
		.map(House::getId)
		.collect(Collectors.toList());
System.out.println(houseIdList1);
List<String> houseIdList2 = personList3
		.stream()
		// 获取所有的HouseList
		.map(Person::getHouseList)
		// 将所有的HouseList,并将其展平为 List<House>
		.flatMap(Collection::stream)
		.map(House::getId)
		.collect(Collectors.toList());
System.out.println(houseIdList2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值