当前位置:   article > 正文

JDK8新特性(八)之Stream流的map()、sorted()、distinct()、match()方法_stream().map().distinct()

stream().map().distinct()

一、Stream流的map()方法

1.1 map方法的介绍

如果需要将流中的元素映射到另一个流中,可以使用map方法。方法声明:

<R> Stream<R> map(Function<? super T,? extends R> mapper); 

该接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一个R类型的流。

  1. import java.util.stream.Stream;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. Stream<String> original = Stream.of("11","22","33");
  5. //Map可以将一种类型的流转换成另一种类型的流
  6. //将Stream流中的字符串转成Integer
  7. //Stream<Integer> stream = original.map((String s)->{
  8. // return Integer.parseInt(s);
  9. //});
  10. //original.map(s->Integer.parseInt(s)).forEach(System.out::println);
  11. //map方法的参数通过方法引用,将字符串类型转换成为int类型(并自动装箱为Integer类对象)
  12. original.map(Integer::parseInt).forEach(System.out::println);
  13. }
  14. }

执行上述代码,其输出结果为:

  1. 11
  2. 22
  3. 33

1.2 将List<Object>转换为自定义的List<Map>

  1. import lombok.Data;
  2. @Data
  3. public class Person {
  4. private String name;
  5. private int sex;
  6. private String address;
  7. private String phoneNumber;
  8. }
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.stream.Collectors;
  6. public class Demo {
  7. private static List<Person> buildData(int number){
  8. List<Person> list =new ArrayList<>();
  9. for(int i=0;i<number;i++){
  10. Person person=new Person();
  11. person.setName("张三"+i);
  12. person.setSex(1);
  13. person.setPhoneNumber("1880521321"+i);
  14. person.setAddress("北京天通苑"+i);
  15. list.add(person);
  16. }
  17. return list;
  18. }
  19. public static void main(String[] args){
  20. List<Person> personList=buildData(3);
  21. List<Map> collect = personList.stream().map(x -> {
  22. Map map = new HashMap();
  23. map.put("name", x.getName());
  24. map.put("sex", x.getSex());
  25. map.put("address", x.getAddress());
  26. return map;
  27. }).collect(Collectors.toList());
  28. System.out.println(collect);
  29. }
  30. }

执行上述代码,其输出结果为: 

[{address=北京天通苑0, sex=1, name=张三0}, {address=北京天通苑1, sex=1, name=张三1}, {address=北京天通苑2, sex=1, name=张三2}]

1.3 将List<Object>转换为对象中的某个字段的集合

  1. import lombok.AllArgsConstructor;
  2. import lombok.Data;
  3. import lombok.NoArgsConstructor;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. @NoArgsConstructor
  7. @Data
  8. @AllArgsConstructor
  9. public class Student {
  10. private int classId;
  11. private String name;
  12. private int score;
  13. public static List<Student> buildData(){
  14. List<Student> studentList = new ArrayList<>();
  15. Student student1 = new Student(1,"张三",80);
  16. Student student2 = new Student(1,"李四",59);
  17. Student student3 = new Student(2,"王五",90);
  18. studentList.add(student1);
  19. studentList.add(student3);
  20. studentList.add(student2);
  21. return studentList;
  22. }
  23. }
  1. import java.util.List;
  2. import java.util.stream.Collectors;
  3. public class Demo {
  4. public static void main(String[] args) {
  5. List<Student> studentList = Student.buildData();
  6. List<String> names = studentList.stream().map(Student::getName).collect(Collectors.toList());
  7. System.out.println(names);
  8. }
  9. }

执行上述代码,其输出结果为:  

[张三, 王五, 李四]

二、Stream流的sorted()方法 

2.1 sorted()方法的介绍

如果需要将数据排序,可以使用sorted方法。方法声明:

  1. Stream<T> sorted();
  2. Stream<T> sorted(Comparator<? super T> comparator);
  1. import java.util.stream.Stream;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. Stream<Integer> stream = Stream.of(33,22,11,55);
  5. // sorted():根据元素的自然顺序排序
  6. //stream.sorted().forEach(System.out::println);
  7. // sorted(Comparator<? super T> comparator):根据比较指定的规则排序
  8. stream.sorted((Integer i1,Integer i2)->{
  9. return i2-i1;
  10. }).forEach(System.out::println);
  11. }
  12. }

执行上述代码,其输出结果为:

  1. 55
  2. 33
  3. 22
  4. 11

上述stream.sorted()方法还可以进一步简化:

stream.sorted((i1,i2)-> i2-i1).forEach(System.out::println);

sorted方法除了可以根据元素的自然顺序排序,也可以指定比较器排序

2.2 指定比较器进行排序

2.2.1 升序排序

  1. //对象集合以类属性一升序排序
  2. list.stream().sorted(Comparator.comparing(类::属性一));

例如下面这个示例就是以User类的id属性进行升序排序:

  1. import lombok.AllArgsConstructor;
  2. import lombok.Data;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. @Data
  6. @AllArgsConstructor
  7. public class User {
  8. private int id;
  9. private String name;
  10. public static List<User> buildData(){
  11. List<User> userList = new ArrayList<>();
  12. User user1 = new User(1,"张三");
  13. User user2 = new User(2,"李四");
  14. User user3 = new User(3,"王五");
  15. userList.add(user2);
  16. userList.add(user1);
  17. userList.add(user3);
  18. return userList;
  19. }
  20. }
  1. import java.util.Comparator;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class SortedDemo {
  5. public static void main(String[] args){
  6. List<User> userList = User.buildData();
  7. System.out.println("排序前:");
  8. userList.forEach(System.out::println);
  9. System.out.println("排序后:");
  10. userList = userList.stream().sorted(Comparator.comparing(User::getId)).collect(Collectors.toList());
  11. userList.forEach(System.out::println);
  12. }
  13. }

执行上述代码,其输出结果为:

  1. 排序前:
  2. User(id=2, name=李四)
  3. User(id=1, name=张三)
  4. User(id=3, name=王五)
  5. 排序后:
  6. User(id=1, name=张三)
  7. User(id=2, name=李四)
  8. User(id=3, name=王五)

3.Stream流的distinct()方法

如果需要去除重复数据,可以使用distinct方法。方法声明:

Stream<T> distinct();
  1. import java.util.stream.Stream;
  2. public class Demo {
  3. public static void main(String[] args) {
  4. Stream<Integer> stream = Stream.of(22,33,22,11,33);
  5. stream.distinct().forEach(System.out::println);
  6. Stream<String> stream1 = Stream.of("aa","bb","aa","bb","cc");
  7. stream1.distinct().forEach(System.out::println);
  8. }
  9. }

执行上述代码,其输出结果为:

  1. 22
  2. 33
  3. 11
  4. aa
  5. bb
  6. cc

distinct对自定义对象去除重复,首先需要对类的equals()和hscode()进行重写

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public Person(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. @Override
  9. public boolean equals(Object o) {
  10. if(this==o) {
  11. return true;
  12. }
  13. if(o==null || getClass()!=o.getClass()) {
  14. return false;
  15. }
  16. Person person =(Person)o;
  17. if(age!=person.age) {
  18. return false;
  19. }
  20. return name!=null?name.equals(person.name):person.name ==null;
  21. }
  22. @Override
  23. public int hashCode(){
  24. int result =name!=null?name.hashCode():0;
  25. result=31*result+age;
  26. return result;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public int getAge() {
  35. return age;
  36. }
  37. public void setAge(int age) {
  38. this.age = age;
  39. }
  40. @Override
  41. public String toString() {
  42. return "Person{" +
  43. "name=" + name +
  44. ", age=" + age +
  45. '}';
  46. }
  47. }
  1. public static void main(String[] args) {
  2. Stream<Person> stream = Stream.of(
  3. new Person("貂蝉",18),
  4. new Person("西施",18),
  5. new Person("西施",18),
  6. new Person("王昭君",18)
  7. );
  8. stream.distinct().forEach(System.out::println);
  9. }

执行上述代码,其输出结果为:

  1. Person{name=貂蝉, age=18}
  2. Person{name=西施, age=18}
  3. Person{name=王昭君, age=18}

四、Stream流的match()方法

如果需要判断数据是否匹配指定的条件,可以使用Match相关方法。方法声明:

  1. boolean allMatch(Predicate<? super T> predicate);
  2. boolean anyMatch(Predicate<? super T> predicate);
  3. boolean noneMatch(Predicate<? super T> predicate);
  1. public static void main(String[] args) {
  2. Stream<Integer> stream = Stream.of(7,8,6,4);
  3. //boolean b=stream.allMatch(i->i>0); //allMatch:匹配所有元素,所有元素都需要满足条件
  4. boolean b =stream.noneMatch(i-> i<5);//noneMatch:匹配所有元素,所有元素都不满足条件则返回true
  5. System.out.println(b);
  6. }

执行上述代码,其输出结果为:

false

4.1 anyMatch

anyMatch:只要有一个元素满足条件,就返回true,否则返回false。 

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Demo {
  4. private static List<String> buildData(){
  5. List<String> list =new ArrayList<>();
  6. list.add("张三");
  7. list.add("李四");
  8. list.add("王五");
  9. return list;
  10. }
  11. public static void main(String[] args){
  12. // list列表中只要有一个为“张三”,那么就返回True,否则的话返回False
  13. List<String> list = buildData();
  14. boolean flag= list.stream().anyMatch((String name) -> "张三".equals(name));
  15. System.out.println(flag);
  16. }
  17. }

执行上述代码,其输出结果为:

true
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/352313
推荐阅读
相关标签
  

闽ICP备14008679号