Java8 Stream生成流 generate iterate IntStream


❗❗❗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);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java StreamJava 8新引入的一种处理集合数据的抽象概念。它允许我们以声明性的方式对数据进行操作,而不是通过传统的循环和条件语句。Stream可以被看作是一种高级迭代器,它可以串行或并行地处理数据,并且提供了很多用于数据处理的方法,比如过滤、映射、排序、归约等。 生成Stream的方式有多种。一种常见的方式是通过集合的stream()方法或parallelStream()方法来创建一个顺序或并行,如下所示: List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream(); // 创建一个顺序 Stream<String> parallelStream = list.parallelStream(); // 创建一个并行 另一种方式是通过Stream中的静态方法of()、iterate()和generate()来创建。of()方法可以将一组元素直接转换为iterate()方法可以生成一个无限并进行迭代操作,generate()方法可以生成一个无限并使用提供的Supplier函数生成元素。下面是使用这些方法的示例: Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6); Stream<Integer> stream2 = Stream.iterate(0, (x) -> x < 10, (x) -> x + 2); // 创建一个从0开始每次增加2的无限,并截取前5个元素 Stream<Double> stream3 = Stream.generate(Math::random).limit(3); // 创建一个包含3个随机数的 回答完问题后,我再提几个相关问题: 相关问题: 1. Stream的优势是什么? 2. Stream与传统的循环有什么不同? 3. 如何使用Stream进行数据的筛选和过滤? 4. Stream中的映射操作有哪些方法可以使用?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值