例题一
怎样用 map 和 reduce 方法数一数流中有多少个Employee?
package Exer.exer18;
import Shang2149.exer.Employee;
import org.junit.jupiter.api.Test;
import java.util.*;
import java.util.stream.Stream;
public class MapTest {
/*
*
* StreamAPI:
*给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?
* 例如,给定【1,2,3,4,5】, 应该返回【1,4,9,16,25】。
* */
@Test
public void test01() {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Stream<Integer> stream = list.stream();
stream.map(x -> x * x).forEach(System.out::println);
}
@Test
public void test02() {
/*
* 怎样用 map 和 reduce 方法数一数流中有多少个Employee呢?
* */
List<Employee> emps = Arrays.asList(
new Employee(102, "李四", 6666.66, 59),
new Employee(101, "张三", 9999.99, 18),
new Employee(103, "王五", 3333.33, 28),
new Employee(104, "赵六", 7777.77, 48),
new Employee(104, "赵六", 7777.77, 58),
new Employee(104, "赵六", 7777.77, 68),
new Employee(105, "田七", 5555.55, 38)
);
//方式一
Optional<Integer> count = emps.stream().map((e) -> 1).reduce(Integer::sum);
System.out.println(count.get());
//方式二
Stream<Employee> count1 = emps.stream();
System.out.println(count1.count());
}
}
其中方式一中的 (e) - > 1
表达的意思是每有一条数据,便 return 1.由最后的reduce方法使用sum收集。若改成2则返回值为双倍的元素数量。(个人理解)
例题二
现在有两个 ArrayList 集合存储队伍当中的多个成员姓名, 要求使用Stream方式进行以下若干操作步骤: 1. 第一个队伍只要名字为3个字的成员姓名; 2. 第一个队伍筛选之后只要前4个人; 3. 第二个队伍只要姓张的成员姓名; 4. 第二个队伍筛选之后不要前1个人; 5. 将两个队伍合并为一个队伍; 6. 根据姓名创建Member对象;Member类型包含name属性 7. 打印整个队伍的Member对象信息。
package Exer.exer18;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class FilterTest {
@Test
public void test01() {
List<String> one = new ArrayList<>();
one.add("清风");
one.add("陈玄风");
one.add("梅超风");
one.add("陆乘风");
one.add("曲灵风");
one.add("武眠风");
one.add("冯默风");
one.add("罗玉风");
List<String> two = new ArrayList<>();
two.add("宋远桥");
two.add("俞莲舟");
two.add("俞岱岩");
two.add("张松溪");
two.add("张翠山");
two.add("殷梨亭");
two.add("张声谷");
//1. 第一个队伍只要名字为3个字的成员姓名;
// 2. 第一个队伍筛选之后只要前4个人;
Stream<String> stream1 = one.stream().filter(s -> s.length() == 3).limit(4);
// 3. 第二个队伍只要姓张的成员姓名;
// 4. 第二个队伍筛选之后不要前1个人;
Stream<String> stream2 = two.stream().filter(s -> s.startsWith("张")).skip(1);
//5. 将两个队伍合并为一个队伍;
//6. 根据姓名创建Member对象;Member类型包含name属性
//7. 打印整个队伍的Member对象信息。
Stream.concat(stream1, stream2).map(Member::new).forEach(System.out::println);
}
}
class Member {
private String name;
@Override
public String toString() {
return "Member{" +
"name='" + name + '\'' +
'}';
}
public Member(String name) {
this.name = name;
}
public Member() {
}
}