Lambda表达式3:Stream的筛选与切片

1、基础介绍

流:是数据渠道,用于操作数据源(集合,数组等)所生成的元素序列;
集合讲的是数据,流讲的是计算;
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

2、创建流(Stream)的方式

@Test
public void test1(){
	// 1、通过Collection集合提供的stream()或parallelStream()
	List list = new ArrayList();
	Stream stream = list.parallelStream();
	
	// 2、通过Arrays的静态方法stream()获取
	Student[] students = new Student[10];
	Stream stream2 = Arrays.stream(students);
	
	// 3、通过Stream类的静态方法of()
	Stream stream3 = Stream.of("1","2");
	
	// 4、创建无限流(迭代)
	Stream stream4 = Stream.iterate(0, (x) -> x+2);
	stream4.limit(5).forEach(System.out::println);
	
	// 5、生成
	Stream.generate(() -> Math.random()).limit(4).forEach(System.out::println);
}

3、筛选与切片

filter:接收Lambda,从流中排除某些元素;
limit(n):截断流,使其不超过给定元素;
skip(n):跳过元素,返回跳过前n个元素。若元素不足n个,则返回一个空流;
distinct:筛选,通过流生成的hashcode()和equals()方法去重;

List list = Arrays.asList(
			new Student(1,"张三",60),
			new Student(2,"李四",70),
			new Student(3,"王五",80),
			new Student(4,"赵六",90),
			new Student(4,"赵六",90),
			new Student(4,"赵六",90),
			new Student(5,"田七",100)); 
	
// 内部迭代:迭代操作由Stream API完成
@Test
public void test1(){
	list.stream().filter((x) -> x.getId()>2).forEach(System.out::println);;
}


@Test
public void test2(){
	list.stream().filter((x) -> x.getId() > 2)
//		.limit(2)
	.skip(2)
	.distinct()
	.forEach(System.out::println);
}
  • test1输出:
    Lambda表达式3:Stream的筛选与切片_第1张图片
  • test2输出:
    Lambda表达式3:Stream的筛选与切片_第2张图片

你可能感兴趣的:(jdk8新特性)