这篇文章将为大家详细讲解有关Java8中Stream的筛选,切片与映射怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
创建Stream
中间操作
终止操作(终端操作)
@Test
public void test1(){
//创建Stream
//1.可以通过Collection系列集合提供的stream()获取串行流或parallelStream()获取并行流
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
//2.通过Arrays中的静态方法stream()获取数组流
Employee[] emps = new Employee[10];
Stream<Employee> stream2 = Arrays.stream(emps);
//3.通过Stream类中的静态方法of()
Stream<String> stream3 = Stream.of("aa", "bb", "cc");
//4.创建无限流
//通过迭代创建无限流
Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
//中间操作和终止操作
stream4.limit(10).forEach(System.out::println);
//通过生成随机数创建无限流
Stream.generate(() -> Math.random())
.limit(5)
.forEach(System.out::println);
}
内部迭代:迭代操作由Stream API自己完成
外部迭代:由自己写的程序完成
//内部迭代:迭代操作由Stream API完成
@Test
public void test1(){
//中间操作:不会执行任何操作
Stream<Employee> employeeStream = employees.stream()
.filter((e) -> {
System.out.println("Stream API的中间操作");
return e.getAge() > 35;
});
//终止操作:一次性执行全部内容,即"惰性求值"
employeeStream.forEach(System.out::println);
}
//外部迭代
@Test
public void test2(){
Iterator<Employee> iterator = employees.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
filter---接收Lambda,从流中排除某些元素
limit---截断流,使其元素不超过给定的数量
skip(n)---跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流,与limit(n)互补
distinct---筛选,通过流所生成元素的hashCode( )和equals( )去除重复元素
List<Employee> employees = Arrays.asList(
new Employee("张三", 18 ,9999.99),
new Employee("李四", 38, 5555.99),
new Employee("王五", 50, 6666.66),
new Employee("赵六", 16, 3333.33),
new Employee("田七", 8, 7777.77),
new Employee("田七", 8, 7777.77),
new Employee("田七", 8, 7777.77)
);
@Test
public void test3(){
employees.stream()
.filter((e) -> {
System.out.println("短路");
return e.getSalary() > 5000;
})
.limit(2)
.forEach(System.out::println);
}
@Test
public void test4(){
employees.stream()
.filter((e) -> e.getSalary() > 5000)
.skip(2)
.forEach(System.out::println);
}
@Test
public void test5(){
employees.stream()
.filter((e) -> e.getSalary() > 5000)
.skip(2)
.distinct()
.forEach(System.out::println);
}
map---接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该参数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap---接收一个函数作为参数,将流中的每个值换成另一个流,然后把所有流连接成一个流
public static Stream<Character> filterCharacter(String str){
List<Character> list = new ArrayList<>();
for (Character ch : str.toCharArray()){
list.add(ch);
}
return list.stream();
}
@Test
public void test6(){
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
list.stream()
.map((str) -> str.toUpperCase())
.forEach(System.out::println);
System.out.println("----------------------------");
employees.stream()
.map(Employee::getName)
.forEach(System.out::println);
System.out.println("-----------------------------");
Stream<Stream<Character>> stream = list.stream()
.map(TestStreamAPI2::filterCharacter);//{{a, a, a}, {b, b, b}}
stream.forEach((sm) -> {
sm.forEach(System.out::println);
});
System.out.println("--------------------------------");
Stream<Character> sm = list.stream()
.flatMap(TestStreamAPI2::filterCharacter);//{a, a, a, b, b, b}
sm.forEach(System.out::println);
}
关于“Java8中Stream的筛选,切片与映射怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。