/**
* 创建流
*
1.of() 由Stream的静态方法of()创建: Stream stream = Stream.of(“Lambda”, “Java8”, “JavaWeb”, “javaEE”);
* 2.由数组创建流 由Arrays的静态方法stream()创建 String[] words = {“Hello”, “World”}; Arrays.stream(words)
* 3.由文件生成流 通过Files的lines()方法,会将每一行都转化称为stream
* 4.由函数生成流:创建无限流(流没有结尾)
*
* 使用流
*
* 一.筛选和切片
1.筛选(filter方法) 即我们之前的过滤,参数是一个谓词Predicate,
并且返回所有复合谓词判断的元素的流
2.去重 distinct()
3.截短流 limit()
4.跳过元素 skip()
二.映射()
1.map() 它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素
2.floatMap() 把流中的每个值都转换成另一个流,然后把所有的流连接起来称为一个流*三.查找与匹配
查看数据集中的某些元素是否匹配一个给定的属性
主要有以下几个API: allMatch、anyMatch、noneMatch、findFirst和findAny
1.allMatch 检查是否匹配所有元素
2.anyMatch 检查至少匹配一个元素
3.noneMathch 代表流中没有任何元素与给定的条件匹配
4.findFirst 查找第一个元素
Optional findFirst()返回描述此流的第一个元素的Optional如果流为空,
则返回一个空的Optional 。
如果流没有遇到顺序,则可能会返回任何元素。
5.findAny 将返回当前流中的任意元素,随机四.归约
1.元素求和 reduce
2.最大和最小 max() and min()
- 案例
package IO.stream;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* User: 彭家琪
* Date: 2019/9/16 15:19
*/
public class StreamDemo {
private List<java8.Employee> employees = new ArrayList<>(6);
@Before
public void before() {
employees.add(new Employee(0001, "张三", 26, 6500, 822));
employees.add(new Employee(0002, "李四", 29, 8500, 881));
employees.add(new Employee(0003, "王五", 24, 3500, 839));
employees.add(new Employee(0004, "赵六", 32, 11300, 803));
employees.add(new Employee(0005, "胡七", 32, 13100, 946));
employees.add(new Employee(0006, "刘八", 28, 7500, 866`在这里插入代码片`));
}
/**
* 创建流
*
* 1.of() 由Stream的静态方法of()创建: Stream<String> stream = Stream.of("Lambda", "Java8", "JavaWeb", "javaEE");
* 2.由数组创建流 由Arrays的静态方法stream()创建 String[] words = {"Hello", "World"}; Arrays.stream(words)
* 3.由文件生成流 通过Files的lines()方法,会将每一行都转化称为stream
* 4.由函数生成流:创建无限流(流没有结尾)
*
* 使用流
*
* 一.筛选和切片
1.筛选(filter方法) 即我们之前的过滤,参数是一个谓词Predicate,
并且返回所有复合谓词判断的元素的流
例如: 上述简单案例,筛选出年龄小于30的员工
2.去重 distinct()
3.截短流 limit()
4.跳过元素 skip()
* 二.映射()
1.map() 它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素
2.floatMap() 把流中的每个值都转换成另一个流,然后把所有的流连接起来称为一个流
*三.查找与匹配
* 查看数据集中的某些元素是否匹配一个给定的属性
* 主要有以下几个API: allMatch、anyMatch、noneMatch、findFirst和findAny
1.allMatch 检查是否匹配所有元素
2.anyMatch 检查至少匹配一个元素
3.noneMathch 代表流中没有任何元素与给定的条件匹配
4.findFirst 查找第一个元素
Optional<T> findFirst()返回描述此流的第一个元素的Optional如果流为空,
则返回一个空的Optional 。
如果流没有遇到顺序,则可能会返回任何元素。
5.findAny 将返回当前流中的任意元素,随机
* 四.归约
1.元素求和 reduce
2.最大和最小 max() and min()
*/
//去重
@Test
private void test2() {
List<Integer> num = Arrays.asList(1, 2, 3, 2, 4, 2, 4, 5);
num.stream().filter(i -> i % 2 != 0).distinct().forEach(System.out::println);
}
//映射
@Test
public void maptest3() {
List<String> result = employees.stream().map(employee -> employee.getName()).collect(Collectors.toList());
System.out.println(result);
//1.映射称为新的集合,集合内容为原集合元素的字符串长度
//2.映射称为新的集合,集合内容为原集合元素的字符串的大写
List<String> lis = Arrays.asList("Lambda", "java8", "javaWeb","javaEE");
lis.stream().map(e->e.length()).collect(Collectors.toList()).forEach(System.out::println);//1
lis.stream().map(e->e.toUpperCase()).collect(Collectors.toList()).forEach(System.out::println);//2
}
@Test
public void findtest4() {
System.out.println(employees.stream().allMatch(employee -> employee.getAge() < 30 && employee.getAge() > 25));
System.out.println(employees.stream().anyMatch(employee -> employee.getAge() < 30));
System.out.println(employees.stream().noneMatch(employee -> employee.getAge() > 30));
Optional<java8.Employee> first = employees.stream().filter(employee -> employee.getAge() < 30).findFirst();
System.out.println(first);
}
@Test
public void gytest5() {
List<Integer> i = Arrays.asList(1,3,5,7,9,11,13,15,17,19,21);
System.out.println(i.stream().reduce(0, (x, y) -> x + y));
Optional<Double> sum = employees.stream().map(employee -> employee.getSalary()).reduce((a, b) -> a + b);
System.out.println("sum: "+sum);
// System.out.println(employees.stream().map(employee -> employee.getSalary()).reduce(Double::sum ));
Integer max = i.stream().reduce(0,(a, b) -> a > b ? a : b );
System.out.println("最高: "+max);
// employees.stream().sorted((e1,e2)->e1.getAge() - e2.getAge()).forEach(System.out::println);
employees.stream().sorted(Comparator.comparingInt(java8.Employee::getAge)).forEach(System.out::println);
}
@Test
public void random(){
Stream.generate(Math::random) .limit(5) .forEach(System.out::println);
}
}
package java8;
/**
* User: 彭家琪
* Date: 2019/9/11 11:33
*/
public class Employee {
private int id;
private String name;
private int age;
private double salary;
private int workHoursForYears;
public Employee() {
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
", workHoursForYears=" + workHoursForYears +
'}';
}
public int getId() {
return id;
}
public int getWorkHoursForYears() {
return workHoursForYears;
}
public void setWorkHoursForYears(int workHoursForYears) {
this.workHoursForYears = workHoursForYears;
}
public Employee(int id, String name, int age, double salary, int workHoursForYears) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
this.workHoursForYears = workHoursForYears;
}
}