- Stream
- 中间操作
- filter
- limit
- skip
- distinct
- map
- flatMap
- sort
- 终止操作
- allMatch
- anyMatch
- noneMatch
- findFirst 和 findAny
- count、max和min
- reduce
- collect
记录下java的一些Stream用法。。。 Stream
用来测试的类 Employee
public class Employee {
private String name; // 姓名
private int salary; // 薪资
private int age; // 年龄
private String sex; //性别
private String area; // 地区
private Status status;
public Employee() {
}
public Employee(String name, int salary, int age, String sex, String area) {
this.name = name;
this.salary = salary;
this.age = age;
this.sex = sex;
this.area = area;
}
public Employee(String name, int salary, int age, String sex, String area, Status status) {
this.name = name;
this.salary = salary;
this.age = age;
this.sex = sex;
this.area = area;
this.status = status;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return salary == employee.salary &&
age == employee.age &&
Objects.equals(name, employee.name) &&
Objects.equals(sex, employee.sex) &&
Objects.equals(area, employee.area);
}
@Override
public int hashCode() {
return Objects.hash(name, salary, age, sex, area);
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + ''' +
", salary=" + salary +
", age=" + age +
", sex='" + sex + ''' +
", area='" + area + ''' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public enum Status{
FREE,BUSY,VOCATION
}
}
初始化测试对象
List中间操作 filteremps = Arrays.asList( new Employee("张三", 10000, 25, "男", "海南", Employee.Status.FREE), new Employee("李四", 20000, 26, "女", "浙江", Employee.Status.BUSY), new Employee("王五", 15000, 28, "男", "海南", Employee.Status.VOCATION), new Employee("赵六", 15600, 28, "男", "海南", Employee.Status.FREE), new Employee("赵六", 20000, 51, "女", "广东", Employee.Status.VOCATION));"));
@Test
public void test1() {
Stream stream = list.stream().filter((e) -> e.getAge() > 25);
stream.forEach(System.out::println);
}
结果:
Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}
Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}
limit
@Test
public void test2() {
Stream stream = emps.stream().limit(1);
stream.forEach(System.out::println);
}
结果:
Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}
skip
@Test
public void test3() {
Stream stream = emps.stream().skip(2);
stream.forEach(System.out::println);
}
结果:
Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}
distinct
@Test
public void test4() {
emps.stream().distinct().forEach(System.out::println);
}
map
@Test
public void test5() {
List strs = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
strs.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
System.out.println("------------------------");
emps.stream().map((e) -> e.getName()).forEach(System.out::println);
emps.stream().map(Employee::getName).forEach(System.out::println);
System.out.println("------------------------");
// map中处理的是aaa,bbb,ccc每次传入的,然后返回一个流,于是就返回了多个流,放入一个流中
Stream> stream = strs.stream().map(TestStreamApi::filterCharacter);
stream.forEach((s) -> s.forEach(System.out::println));
}
public static Stream filterCharacter(String str) {
ArrayList list = new ArrayList<>();
for (Character c : str.toCharArray()) {
list.add(c);
}
return list.stream();
}
flatMap
@Test
public void test6() {
List strs = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
Stream stream = strs.stream().flatMap(TestStreamApi::filterCharacter);
stream.forEach(System.out::println);
}
结果:
a
a
a
b
b
b
c
c
c
d
d
d
e
e
e
sort
@Test
public void test7() {
List strs = Arrays.asList("ccc", "eee", "aaa", "ddd", "bbb");
strs.stream().sorted().forEach(System.out::println);
System.out.println("-------------------");
Stream stream = emps.stream().sorted((e1, e2) -> {
if (e1.getAge() == e2.getAge()) {
return e1.getName().compareTo(e2.getName());
} else {
return e1.getAge();
}
});
stream.forEach(System.out::println);
}
结果:
aaa
bbb
ccc
ddd
eee
-------------------
Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}
Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}
Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}
终止操作
allMatch
@Test
public void test() {
boolean b = emps.stream().allMatch(employee -> employee.getStatus().equals(Employee.Status.BUSY));
System.out.println(b);
}
结果:
false
anyMatch
@Test
public void test2() {
boolean b = emps.stream().anyMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
System.out.println("b = " + b);
}
结果:
b=true
noneMatch
@Test
public void test3() {
boolean b = emps.stream().noneMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
System.out.println("b = " + b);
}
结果:
b = false
findFirst 和 findAny
@Test
public void test4() {
Optional op = emps.stream()
.sorted((e1, e2) -> -Double.compare(e1.getSalary(), e2.getSalary()))
.findFirst();
System.out.println("employee = " + op.get());
System.out.println("-----------------");
Optional op1 = emps.parallelStream().filter(e -> e.getStatus().equals(Employee.Status.FREE)).findAny();
System.out.println("employee1 = " + op1.get());
}
结果:
employee = Employee{name='002', salary=20000, age=26, sex='女', area='浙江'}
-----------------
employee1 = Employee{name='003', salary=15600, age=28, sex='男', area='海南'}
count、max和min
@Test
public void test5() {
long count = emps.stream().count();
System.out.println("count = " + count);
Optional op = emps.stream().max((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
System.out.println("op = " + op.get());
Optional op1 = emps.stream().min((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
System.out.println("op1 = " + op1.get());
}
结果:
count = 4
op = Employee{name='004', salary=15000, age=28, sex='男', area='海南'}
op1 = Employee{name='001', salary=10000, age=25, sex='男', area='海南'}
reduce
@Test
public void test() {
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 将参数1 identity作为x,将list中的元素作为y,执行x+y,在将结果作为x,list中的下一个元素作为y反复执行
Integer sum = list.stream().reduce(1, (x, y) -> x + y);
System.out.println("sum = " + sum);
System.out.println("-------------------");
Integer sum2 = emps.stream().map(Employee::getSalary).reduce(0, (x, y) -> x + y);
System.out.println("sum2 = " + sum2);
Optional op = emps.stream().map(Employee::getSalary).reduce(Integer::sum);
System.out.println("op.get() = " + op.get());
}
结果:
sum = 56
-------------------
sum2 = 80600
op.get() = 80600
collect
@Test
public void test2() {
List list = emps.stream().map(Employee::getName).collect(Collectors.toList());
for (String s : list) {
System.out.println(s);
}
System.out.println("---------------------------------");
Set set = emps.stream().map(Employee::getName).collect(Collectors.toSet());
set.forEach(System.out::println);
System.out.println("--------------总数-------------------");
Long count = emps.stream().collect(Collectors.counting());
System.out.println("count = " + count);
System.out.println("--------------平均数-------------------");
Double average = emps.stream().collect(Collectors.averagingInt(Employee::getAge));
System.out.println("average = " + average);
}
结果:
张三
李四
王五
赵六
赵六
---------------------------------
李四
张三
王五
赵六
--------------总数-------------------
count = 5
--------------平均数-------------------
average = 31.6
// 分组
@Test
public void test3() {
Map> map = emps.stream().collect(Collectors.groupingBy(e -> e.getStatus()));
Map> map1 = emps.stream().collect(Collectors.groupingBy(Employee::getStatus));
System.out.println("map = " + map);
System.out.println("map1 = " + map1);
}
结果:
map = {FREE=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}], VOCATION=[Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}], BUSY=[Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}]}
map1 = {FREE=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}], VOCATION=[Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}], BUSY=[Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}]}
// 多级分组
@Test
public void test4() {
Map>> map = emps.stream().collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {
if (e.getAge() <= 35) {
return "青年";
} else if (e.getAge() <= 50) {
return "中年";
} else {
return "老年";
}
}
)));
System.out.println("map = " + map);
}
结果:
map = {VOCATION={青年=[Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}], 老年=[Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}]}, BUSY={青年=[Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}]}, FREE={青年=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}]}}
// 分片
@Test
public void test5() {
Map> map = emps.stream().collect(Collectors.partitioningBy(e -> e.getSalary() > 20000));
System.out.println("map = " + map);
}
结果:
map = {false=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}, Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}], true=[]}
// 连接
@Test
public void test6() {
String s = emps.stream()
.map(Employee::getName).collect(Collectors.joining(","));
System.out.println("s = " + s);
}
结果:
s = 张三,李四,王五,赵六,赵六
关于stream使用暂时记录到这,后续遇到的也记录进来
可以看看我的学习——基于Hexo的个人博客:
网站:http://www.fuzm.wang
—————————————————————————
作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。



