/* 练习题一
* 1. 定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10
* 过滤奇数,只留下偶数,并将结果保存起来
*/
int[] arr1 = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
IntStream stream = Arrays.stream(arr1);
List<Integer> collect = stream.filter(a -> a % 2 == 0).boxed().collect(Collectors.toList());
collect.stream().forEach(System.out::println);
divider();
/* 练习题二
* 2. 创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄
* "zhangsan,23"
* "lisi,24"
* "wangwu,25"
* 保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
*/
ArrayList<String> userList = new ArrayList<>();
Collections.addAll(userList,
"zhangsan,23",
"lisi,24",
"wangwu,25",
"zhubajie,1322",
"sunwukong,800",
"aa",
null);
Map<String, Integer> collect1 = userList.stream()
.filter(a -> a != null && a.split(",").length > 1)
.filter(a -> Integer.parseInt(a.split(",")[1]) >= 24)
.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.valueOf(s.split(",")[1])));
System.out.println(collect1);
divider();
/* 练习题三
现在有两个ArrayList集合,
第一个集合中:存储6名男演员的名字和年龄。
第二个集合中:存储6名女演员的名字和年龄。
姓名和年龄中间用逗号隔开。比如:张三,23
要求完成如下的操作:
1,男演员只要名字为3个字的前两人
2,女演员只要姓杨的,并且不要第一个
3,把过滤后的男演员姓名和女演员姓名合并到一起
4,将上一步的演员信息封装成Actor对象。
5,将所有的演员对象都保存到List集合中。
备注:演员类Actor,属性只有二个:name,age
*/
// 男演员
ArrayList<String> actors = new ArrayList<>();
// 女演员
ArrayList<String> actress = new ArrayList<>();
// 添加元素
Collections.addAll(actors, "旺财一,25", "张德,23", "朱思渺,38", "刘行,72", "王美雄,54", "黄得壮,48");
Collections.addAll(actress, "杨二小,26", "武连连,33", "刘美,58", "程天天,21", "李红,38", "杨美美,36");
List<String> filterActors = actors.stream()
.filter(a -> a.split(",")[0].length() == 3)
.limit(2)
.collect(Collectors.toList());
List<String> filterActress = actress.stream()
.filter(a -> a.split(",")[0].startsWith("杨"))
.skip(1)
.collect(Collectors.toList());
// 合并
List<String> concatList = Stream.concat(filterActors.stream(), filterActress.stream())
.collect(Collectors.toList());
// 弄成Actor
List<User> actorUserList = concatList.stream()
.map(e -> new User("id", e.split(",")[0], Integer.parseInt(e.split(",")[1])))
.collect(Collectors.toList());
actorUserList.stream().forEach(System.out::println);
package com.uuorb.learning.stream;
import com.uuorb.learning.User;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* 文章参考,见{@see https://cloud.tencent.com/developer/article/1769400 }[项目规范]。
* * <a href="https://cloud.tencent.com/developer/article/1769400" />
*/
public class StreamLearning {
public static void main(String[] args) {
// 一、创建流
// 1. Collection提供的两个方法stream()和parallelStream()
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Stream<String> strStream = list.stream();
strStream.forEach(System.out::println);
divider();
// 2. Array.stream()
int[] arr = new int[] {1, 2, 3, 3, 4, 4, 4, 5, 6};
IntStream arrStream = Arrays.stream(arr);
arrStream.forEach(System.out::println);
divider();
// 3. Stream.of("aaa", "bbb");
Stream<String> strStream2 = Stream.of("aaa", "bbb");
strStream2.forEach(System.out::println);
divider();
// 4. Stream.iterate()
Stream<Integer> iterateStream = Stream.iterate(0, (x) -> x + 2);
iterateStream.limit(30).forEach(System.out::println);
divider();
// 5. Stream.generate(Supplier<T>)
Stream<Double> doubleStream = Stream.generate(new Supplier<Double>() {
@Override
public Double get() {
return Math.random();
}
});
doubleStream.limit(10).forEach(System.out::println);
// 等同于 ===> Stream.generate(Math::random);
divider();
// 二、中间操作
// 2.1 过滤操作
// 2.1.1 filter
Arrays.stream(arr).filter(a -> a > 3).forEach(System.out::println);
divider();
// 2.1.2 distinct,去重,默认是基于对象的 equals()
Arrays.stream(arr).distinct().forEach(System.out::println);
divider();
Stream<User> userStream = Stream.generate(new Supplier<User>() {
@Override
public User get() {
return generateRandomUser();
}
});
// 会调用equals()去重
userStream.limit(10).distinct().forEach(System.out::println);
divider();
List<User> users = Arrays.asList(new User("ID2", "Bob", 30),
new User("ID1", "Alice", 25),
new User("ID2", "Bob", 30),
new User("ID1", "Charlie", 25),
new User("ID3", "David", 35));
// 过滤重复id
users.stream().collect(Collectors.toMap(User::getId, // 根据id去重
user -> user, // 保留用户对象
(existing, replacement) -> existing)).values().forEach(System.out::println);
divider();
// 2.2 映射操作
users.stream().map(e -> e.getAge() * 3).forEach(System.out::println);
divider();
// 2.3 排序
users.stream().sorted(new Comparator<User>() {
public int compare(User o1, User o2) {
return Integer.compare(o1.getAge(), o2.getAge());
}
}).forEach(System.out::println);
// 等同于 ->
users.stream().sorted(Comparator.comparingInt(User::getAge)).forEach(System.out::println);
// 三、终止流
// 3.1 匹配终止流,返回一个数据类型
// 3.1.1 anyMatch -> bool
boolean b = users.stream().anyMatch(e -> e.getAge() > 30);
System.out.println(b);
divider();
// 3.1.2 allMatch -> bool
// 3.1.3 findFirst -> Optional
// 3.1.4 findAny -> Optional
Optional<User> any = users.stream().filter(a -> a.getAge() > 500).findAny();
if (any.isPresent()) {
System.out.println(any.get());
} else {
System.out.println("not user's age larger than 500 ");
}
divider();
// 3.2 总括终止流count,max,min
long count = users.stream().count();
System.out.println(count);
divider();
// 最大的年龄
Optional<User> maxAge = users.stream().max(Comparator.comparingInt(User::getAge));
System.out.println(maxAge);
divider();
Optional<Integer> maxAge2 = users.stream().map(User::getAge).max((o1, o2) -> Integer.compare(o1, o2));
// ----> Optional<Integer> max2 = users.stream().map(User::getAge).max(Integer::compare);
System.out.println(maxAge2);
// 3.3 归约终止流
// 3.3.1 reduce 对流中的数据进行汇总计算
// 统计所有年龄之和
Optional<Integer> totalAge = users.stream().map(User::getAge).reduce(Integer::sum);
System.out.println(totalAge);
divider();
// 3.4 收集终止流 collect
// 3.4.1 counting,summingLong
Long ageCount = users.stream().collect(Collectors.counting());
System.out.println(ageCount);
// summingInt
Integer totalAgeSumming = users.stream().collect(Collectors.summingInt(User::getAge));
System.out.println(totalAgeSumming);
divider();
}
public static void divider() {
System.out.println("------------------");
}
private static final Random random = new Random();
private static final String[] NAMES = {"Alice", "Bob", "Charlie", "David", "Eve", "Frank", "Grace", "Hannah", "Ivy",
"Jack"};
public static User generateRandomUser() {
// 生成随机ID
String id = "ID" + random.nextInt();
// 随机选择一个名字
String name = NAMES[random.nextInt(NAMES.length)];
// 生成随机年龄
int age = random.nextInt();
return new User(id, name, age);
}
}