java8 .stream().sorted().filter().map().collect()用法

https://blog.csdn.net/shine_guo_star/article/details/94383319

 

steam():把一个源数据,可以是集合,数组,I/O channel, 产生器generator 等,转化成流。

map():用于映射每个元素到对应的结果。以下代码片段使用 map 输出了元素对应的平方数:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

filter():filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();

sorted(): 用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

 Collectors: 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("筛选列表: " + filtered);

String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

 

 

//对象类型stream排序
List<User> users = new ArrayList<User>(){
    {
        add(new User("a", "1983/12/24", 36));
        add(new User("a", "1993/12/24", 26));
        add(new User("a", "1973/12/24", 46));
        add(new User("a", "1995/12/24", 24));
        add(new User("a", "1981/12/24", 38));
        add(new User("a", "1991/12/24", 28));
    }
};

//升序
List<User> ascUsers = users.stream().sorted(Comparator.comparing(User :: getAge)).collect(Collectors.toList());
//降序
List<User> descUsers = users.stream().sorted(Comparator.comparing(User :: getAge).reversed()).collect(Collectors.toList());

用户类:必须继承Comparable接口,否则排序调用Comparator.comparing的时候会报错,这点很重要。
public class User implements Comparable<User> {

    @NotNull
    private String name;

    @Format(value="YYYY-MM-DD", message = "字符串格式不正确")
    private String birthday;

    private int age;

    public User(){
    }

    public User(String name, String birthday, int age){
        this.name = name;
        this.birthday = birthday;
        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;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String brithday) {
        this.birthday = birthday;
    }

    /**
     * 两个相同类型的对象,比较多属相是否相等的时候
     * 可以通过重写equals方法来实现
     * @param object
     * @return
     */

    @Override
    public boolean equals(Object object) {
        if (object instanceof User) {
            return this.name.equals(((User) object).getName()) && this.age == ((User) object).getAge();
        } else {
            return false;
        }
    }

    /**
     * 重写 equals 就应当重写 hashcode
     * 因为当两个对象hashcode 值相等,但是 equals 比较为 false,
     * 那么在 HashMap 中会产生链表,影响查询性能
     * @return
     */
    @Override
    public int hashCode() {
        return  this.name.hashCode() + age;
    }

    @Override
    public int compareTo(User user) {
        return name.compareTo(user.getName());
    }
}

 

posted on 2020-06-28 19:51  Toria  阅读(8592)  评论(0编辑  收藏  举报

导航