package com.example.demo.java8;
import com.example.demo.domin.User;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @program: demo
* @description: java8新语法学习1
* @author: guoxu
* @create: 2019-12-11 16:16
*/
public class LearnFor {
/**
stream()优点
无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
stream().map()方法的使用示例:
*/
public static void main(String[] args) {
/**
* 新旧for循环
*/
for (int i = 0; i < 4; i++) {
System.out.println("旧for循环输出"+i); //旧for循环输出0 旧for循环输出1 旧for循环输出2 旧for循环输出3
}
IntStream.range(0, 4).forEach(i -> System.out.println(i+"...")); //0... 1... 2... 3...
// 逆向迭代
for(int i = 5; i > 0; i--) {}
//将一个拉姆表达式传递给 iterate 方法,该方法对给定值进行递减,以便沿着相反方向直行迭代。
//我们使用 limit 函数指定我们希望在迭代周期直行的次数。
IntStream.iterate(5, e -> e-1).limit(5);
/**
* 给定一个集合,仅选择长度为 4 的名称,然后通过逗号将他们连接起来。
*/
List names = Arrays.asList("Jack", "Jill", "Nate", "Kara", "Kim", "Jullie", "Paul", "Peter");
String collect = names.stream()
.filter(name -> name.length() == 4)
.collect(Collectors.joining(","));
System.out.println("用逗号连接的字符串:"+collect); //用逗号连接的字符串:Jack,Jill,Nate,Kara,Paul
List subList = names.stream()
.filter(name -> name.length() == 4)
.collect(Collectors.toList());
System.out.println(subList); //[Jack, Jill, Nate, Kara, Paul]
//计算在 numbers 列表中大于 3 且 小于 8 的偶数并且将该数字乘以 2,然后输出结果。
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
System.out.println(
numbers.stream()
.filter(e -> e > 3)
.filter(e -> e < 8)
.filter(e -> e % 2 == 0)
.mapToInt(e -> e * 2)
.sum()
);//20
//姓名集合中以J开始且长度大于3的字符串,转换为全大写,然后用逗号连接
System.out.println(
names.stream()
.filter(name -> name.startsWith("J"))
.filter(name -> name.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.joining(","))
);//JACK,JILL,JULLIE
//取出对象集合中每一个对象的对应字段加入集合中
List users = new ArrayList<>();
IntStream.range(0, 4).forEach(i -> {
users.add(
User.builder()
.name(i+"q")
.email(i+"qq.com")
.phone(i+"999")
.build()
);
});
List userNames = users.stream()
.map(User::getName)
.collect(Collectors.toList());
System.out.println(userNames); //[0q, 1q, 2q, 3q]
//数组字母小写变大写
List list= Arrays.asList("a", "b", "c", "d");
List upper =list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upper); //[A, B, C, D]
//数组所有元素,按某种规律计算:
List num = Arrays.asList(1,2,3,4,5);
List collect1 = num.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
System.out.println(collect1); //[2, 4, 6, 8, 10]
}
}