zoukankan      html  css  js  c++  java
  • java--lambda

    用lambda表达式实现map

    一提到函数式编程,一提到lambda表达式,怎么能不提map。。。没错,java8肯定也是支持的。请看示例代码:

        @Test
        public void mapTest() {
            List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
            cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
        }

    map函数可以说是函数式编程里最重要的一个方法了。map的作用是将一个对象变换为另外一个。在我们的例子中,就是通过map方法将cost增加了0,05倍的大小然后输出。

    用lambda表达式实现map与reduce

    既然提到了map,又怎能不提到reduce。reduce与map一样,也是函数式编程里最重要的几个方法之一。。。map的作用是将一个对象变为另外一个,而reduce实现的则是将所有值合并为一个,请看:

     
        @Test
        public void mapReduceTest() {
            List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
            double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
            System.out.println(allCost);
        }

    filter操作

    filter也是我们经常使用的一个操作。在操作集合的时候,经常需要从原始的集合中过滤掉一部分元素。

        @Test
        public void filterTest() {
            List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
            List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
            filteredCost.forEach(x -> System.out.println(x));
    
        }

    list转set

            String nameStr = list.stream().map(Person::getName).collect(Collectors.joining(","));
            System.out.println(nameStr);
            //将name 放入到新的 set 集合中
            Set<String> nameSet = list.stream().map(person -> person.getName()).collect(Collectors.toSet());
            nameSet.forEach(e -> System.out.print(e + ","));

    排序

        @Test
        public void test6(){
            List<Person> list = getPersonList();
            //年龄排序
            list.stream().sorted((p1,p2) -> (p1.getAge() - p2.getAge()))
                         .forEach(e -> System.out.println(e.toString()));
            //姓名排序
            System.out.println("----------------------------");
            list.stream().sorted(Comparator.comparing(Person::getName))
                         .forEach(e -> System.out.println(e.toString()));
        }

    boolean flag = Arrays.asList(this.getFeats()).stream().anyMatch(p -> p == ServiceFeature.CODERULES);

    List<String> strs = Arrays.asList("a", "a", "a", "a", "b");
            boolean aa = strs.stream().anyMatch(str -> str.equals("a"));
            boolean bb = strs.stream().allMatch(str -> str.equals("a"));
            boolean cc = strs.stream().noneMatch(str -> str.equals("a"));
            long count = strs.stream().filter(str -> str.equals("a")).count();
            System.out.println(aa);// TRUE
            System.out.println(bb);// FALSE
            System.out.println(cc);// FALSE
            System.out.println(count);// 4
    //去重复
        Stream<T> distinct();
        //排序
        Stream<T> sorted();
        //根据属性排序
        Stream<T> sorted(Comparator<? super T> comparator);
        //对对象的进行操作
        Stream<T> peek(Consumer<? super T> action);
        //截断--取先maxSize个对象
        Stream<T> limit(long maxSize);
        //截断--忽略前N个对象
        Stream<T> skip(long n);
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.List;
    import java.util.stream.Stream;
     
    public class TestJava8 {
        public static List<Emp> list = new ArrayList<>();
        static {
            list.add(new Emp("xiaoHong1", 20, 1000.0));
            list.add(new Emp("xiaoHong2", 25, 2000.0));
            list.add(new Emp("xiaoHong3", 30, 3000.0));
            list.add(new Emp("xiaoHong4", 35, 4000.0));
            list.add(new Emp("xiaoHong5", 38, 5000.0));
            list.add(new Emp("xiaoHong6", 45, 9000.0));
            list.add(new Emp("xiaoHong7", 55, 10000.0));
            list.add(new Emp("xiaoHong8", 42, 15000.0));
        }
     
        public static void println(Stream<Emp> stream) {
            stream.forEach(emp -> {
                System.out.println(String.format("名字:%s,年纪:%s,薪水:%s", emp.getName(), emp.getAge(), emp.getSalary()));
            });
        }
     
        public static void main(String[] args) {
            // 对数组流,先过滤重复,在排序,再控制台输出 1,2,3
            Arrays.asList(3, 1, 2, 1).stream().distinct().sorted().forEach(str -> {
                System.out.println(str);
            });
            // 对list里的emp对象,取出薪水,并对薪水进行排序,然后输出薪水的内容,map操作,改变了Strenm的泛型对象
            list.stream().map(emp -> emp.getSalary()).sorted().forEach(salary -> {
                System.out.println(salary);
            });
            // 根据emp的属性name,进行排序
            println(list.stream().sorted(Comparator.comparing(Emp::getName)));
     
            // 给年纪大于30岁的人,薪水提升1.5倍,并输出结果
            Stream<Emp> stream = list.stream().filter(emp -> {
                return emp.getAge() > 30;
            }).peek(emp -> {
                emp.setSalary(emp.getSalary() * 1.5);
            });
            println(stream);
            // 数字从1开始迭代(无限流),下一个数字,是上个数字+1,忽略前5个 ,并且只取10个数字
            // 原本1-无限,忽略前5个,就是1-5数字,不要,从6开始,截取10个,就是6-15
            Stream.iterate(1, x -> ++x).skip(5).limit(10).forEach(System.out::println);
        }
     
        public static class Emp {
            private String name;
     
            private Integer age;
     
            private Double salary;
     
            public Emp(String name, Integer age, Double salary) {
                super();
                this.name = name;
                this.age = age;
                this.salary = salary;
            }
     
            public String getName() {
                return name;
            }
     
            public void setName(String name) {
                this.name = name;
            }
     
            public Integer getAge() {
                return age;
            }
     
            public void setAge(Integer age) {
                this.age = age;
            }
     
            public Double getSalary() {
                return salary;
            }
     
            public void setSalary(Double salary) {
                this.salary = salary;
            }
     
        }
    }
     
  • 相关阅读:
    nginx把POST转GET请求解决405问题
    Redis安装与配置
    SQL语句-SELECT语句
    SQL语句-delete语句
    SQL语句-UPDATE语句
    SQL语句-INSERT语句
    SQL语句-create语句
    MySQL权限详解
    GTID复制详解
    ansible-playbook的应用实例
  • 原文地址:https://www.cnblogs.com/jentary/p/13777140.html
Copyright © 2011-2022 走看看