java lambda表达式 steam api
案例使用 java版本为 jdk-17
foreach
遍历
public class JavaDemo03 {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
nums.forEach(System.out::println);
}
}
运行结果:
1
2
3
4
5
6
7
8
9
map
逐个操作列表中每一个元素
public class JavaDemo04 {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> numbers = nums.stream().map(num -> num * 2).toList();
numbers.forEach(System.out::println);
}
}
运行结果:
2
4
6
8
10
12
14
16
18
flatMap
先对集合中每个元素进行map,再对map后的每个元素进行flatten
map后的每个元素也是一个集合
public class JavaDemo06 {
public static void main(String[] args) {
List<Integer> listA = new ArrayList<>();
listA.add(1);
listA.add(2);
List<Integer> listB = new ArrayList<>();
listA.add(5);
listA.add(6);
List<List<Integer>> listC = new ArrayList<>();
listC.add(listA);
listC.add(listB);
List<Integer> numbers = listC.stream().flatMap(Collection::stream).toList();
numbers.forEach(System.out::println);
}
}
运行结果:
1
2
5
6
filter
过滤出符合规则的数据生成新的列表
public class JavaDemo07 {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
Person person;
for (int i = 0; i < 10; i++) {
person = new Person("user" + (i + 1), (i + 1) % 2);
persons.add(person);
}
// 获取男性列表
List<Person> manList = persons.stream().filter(user -> user.getGender() == 1).toList();
// 获取女性列表
List<Person> womanList = persons.stream().filter(user -> user.getGender() == 0).toList();
manList.forEach(System.out::println);
System.out.println("+++++++++++++++++++++++");
womanList.forEach(System.out::println);
}
}
class Person {
private String name;
private int gender;
public Person() {
}
public Person(String name, int gender) {
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender=" + gender +
'}';
}
}
class JavaDemo03 {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
nums.forEach(System.out::println);
}
}
运行结果:
Person{name='user1', gender=1}
Person{name='user3', gender=1}
Person{name='user5', gender=1}
Person{name='user7', gender=1}
Person{name='user9', gender=1}
+++++++++++++++++++++++
Person{name='user2', gender=0}
Person{name='user4', gender=0}
Person{name='user6', gender=0}
Person{name='user8', gender=0}
Person{name='user10', gender=0}
reduce
相邻两个元素转为一个元素
列表中的所有元素转为一个元素
1, 2, 3, 4, 5, 6, 7, 8, 9
-1, 3, 4, 5, 6, 7, 8, 9
-4, 4, 5, 6, 7, 8, 9
-8, 5, 6, 7, 8, 9
-13, 6, 7, 8, 9
-19, 7, 8, 9
-26, 8, 9
-34, 9
-43
public class JavaDemo08 {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> numbers = nums.stream().reduce((a, b) -> a - b).stream().toList();
numbers.forEach(System.out::println);
}
}
运行结果:
-43
count
计数器
public class JavaDemo12 {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
long count = nums.stream().filter(num -> num % 2 == 0).count();
System.out.println("列表中偶数是数量 >>> " + count);
}
}
运行结果:
4
distinct
去重
public class JavaDemo13 {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 5, 6, 7, 8, 9, 3, 4, 5, 7, 8, 2, 3);
List<Integer> numbers = nums.stream().distinct().toList();
numbers.forEach(System.out::println);
}
}
运行结果:
1
2
3
5
6
7
8
9
4
sorted
排序类需要实现 Comparable 接口
public class JavaDemo14 {
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
for (int i = 0; i < 10; i++) {
dogs.add(new Dog("dog" + (i + 1), ThreadLocalRandom.current().nextInt(1, 10)));
}
dogs.forEach(System.out::println);
List<Dog> newDogs = dogs.stream().sorted((a, b) -> a.getAge() - b.getAge()).toList();
System.out.println("++++++++++++++");
newDogs.forEach(System.out::println);
}
}
class Dog {
private String name;
private int age;
public Dog() {
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
运行结果:
Dog{name='dog1', age=3}
Dog{name='dog2', age=3}
Dog{name='dog3', age=3}
Dog{name='dog4', age=3}
Dog{name='dog5', age=7}
Dog{name='dog6', age=6}
Dog{name='dog7', age=4}
Dog{name='dog8', age=8}
Dog{name='dog9', age=7}
Dog{name='dog10', age=2}
++++++++++++++
Dog{name='dog10', age=2}
Dog{name='dog1', age=3}
Dog{name='dog2', age=3}
Dog{name='dog3', age=3}
Dog{name='dog4', age=3}
Dog{name='dog7', age=4}
Dog{name='dog6', age=6}
Dog{name='dog5', age=7}
Dog{name='dog9', age=7}
Dog{name='dog8', age=8}
limit
TopN
public class JavaDemo17 {
public static void main(String[] args) {
int base = 1000;
ArrayList<Video> videos = new ArrayList<>();
for (int i = 0; i < 10; i++) {
videos.add(new Video(base + i + 1, ThreadLocalRandom.current().nextInt(100, 1000)));
}
videos.forEach(System.out::println);
System.out.println("+++++++++++++");
videos.sort((a, b) -> b.getGold() - a.getGold());
List<Video> topList = videos.stream().limit(3).toList();
topList.forEach(System.out::println);
}
}
class Video {
private int vid;
private int gold;
public Video() {
}
public Video(int vid, int gold) {
this.vid = vid;
this.gold = gold;
}
public int getVid() {
return vid;
}
public void setVid(int vid) {
this.vid = vid;
}
public int getGold() {
return gold;
}
public void setGold(int gold) {
this.gold = gold;
}
@Override
public String toString() {
return "Video{" +
"vid='" + vid + '\'' +
", gold=" + gold +
'}';
}
}
运行结果:
Video{vid='1001', gold=566}
Video{vid='1002', gold=548}
Video{vid='1003', gold=620}
Video{vid='1004', gold=897}
Video{vid='1005', gold=264}
Video{vid='1006', gold=311}
Video{vid='1007', gold=882}
Video{vid='1008', gold=870}
Video{vid='1009', gold=106}
Video{vid='1010', gold=185}
+++++++++++++
Video{vid='1004', gold=897}
Video{vid='1007', gold=882}
Video{vid='1008', gold=870}
groupBy
分组
public class JavaDemo18 {
public static void main(String[] args) {
List<Animal> animals = new ArrayList<>();
Animal animal;
for (int i = 0; i < 10; i++) {
animal = new Animal("animal" + (i + 1), (i + 1) % 2);
animals.add(animal);
}
// 按照性别分组
Map<Integer, List<Animal>> animalGenderGroup = animals.stream().collect(Collectors.groupingBy(Animal::getGender));
animalGenderGroup.forEach((key, value) -> System.out.println((key == 1 ? "雄性" : "雌性") + " >>> " + value));
}
}
class Animal {
private String name;
private int gender;
public Animal() {
}
public Animal(String name, int gender) {
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", gender=" + gender +
'}';
}
}
运行结果:
雌性 >>> [Animal{name='animal2', gender=0}, Animal{name='animal4', gender=0}, Animal{name='animal6', gender=0}, Animal{name='animal8', gender=0}, Animal{name='animal10', gender=0}]
雄性 >>> [Animal{name='animal1', gender=1}, Animal{name='animal3', gender=1}, Animal{name='animal5', gender=1}, Animal{name='animal7', gender=1}, Animal{name='animal9', gender=1}]