zoukankan      html  css  js  c++  java
  • Lambda表达式例子

    转 Lambda表达式例子

    1.Java8 新特性介绍

    写java的同学对java8肯定知道 那么java8到底有哪些特性呢,总结如下:

    Lambda表达式
    函数式接口
    Stream
    Optional
    Predicate
    Function
    Consumer
    Filter
    Map-Reduce
    新的Date API

    取id 列表

    List<Integer> transactionsIds = transactions.parallelStream().
     filter(t -> t.getType() == Transaction.GROCERY).
     sorted(comparing(Transaction::getValue).reversed()).
     map(Transaction::getId).
     collect(toList());



    最核心的当然是函数式编程了,写代码非常简单,请看下面详细例子介绍

    2.Java8 lambda使用总结-结合实例介绍

    很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生,下面我将结合实例介绍Java8的使用 并与Java7进行比较:

    基础类

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
        private int id;
        private String name;
        private String address;
    }

    1.List操作

    public class ExampleList {
        private static List<String> items = new ArrayList<>();
        static {
            items.add("A");
            items.add("BC");
            items.add("C");
            items.add("BD");
            items.add("E");
        }
        public static void main(String[] args) {
            //Java8之前操作List
            for(String item:items){
                System.out.println(item);
            }
            //Java8 lambda遍历list
            items.forEach(c-> System.out.println(c));
            items.forEach(item->{
                if("C".equals(item)){
                    System.out.println(item);
                }
            });
            System.out.println("--------");
            //先过滤
            items.stream().filter(s->s.contains("B")).forEach(c1-> System.out.println(c1));
        }
    }
    

    2.Map操作

    public class ExampleMap {
        private static Map<String, Integer> items = new HashMap<>();
        static {
            items.put("A", 10);
            items.put("B", 20);
            items.put("C", 30);
            items.put("D", 40);
            items.put("E", 50);
            items.put("F", 60);
        }
        public static void main(String[] args) {
            //Java8之前遍历是这样遍历map
            for(Map.Entry<String,Integer> entry:items.entrySet()){
                System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
            }
            //Java8遍历map
            items.forEach((key,value)-> System.out.println("key:" + key + " value:" + value));
        }
    }
    

    3.Groupingby操作

    /**
     * 
     *Java8 Collectors.groupingBy and Collectors.mapping example
     */
    public class ExampleMapping {
        private static List<Person> personList = Lists.newArrayList();
        static {
            personList.add(Person.builder().id(10).address("apple").address("shanghai").build());
            personList.add(Person.builder().id(12).address("apple").address("wuhan").build());
            personList.add(Person.builder().id(16).address("apple").address("nanjing").build());
        }
        public static void main(String[] args) {
            //分组
            Map<String, List<Person>> collect = personList.stream().collect(Collectors.groupingBy(c -> c.getAddress()));
            System.out.println(collect);
        }
    }
    

    4.List转换为Map

    public class ExampleListConvertMap {
        private static List<Person> personList = Lists.newArrayList();
        static{
            personList.add(Person.builder().id(20).name("zhangsan").address("shanghai").build());
            personList.add(Person.builder().id(30).name("lisi").address("nanjing").build());
        }
        public static void main(String[] args) {
            //Java8 List转换Map
            Map<Integer,Person> map_ = personList.stream().collect(Collectors.toMap((key->key.getId()),(value->value)));
            map_.forEach((key,value)-> System.out.println(key + ":" + value));
            Map<Integer, Person> mappedMovies = personList.stream().collect(  
                Collectors.toMap(Person::getRank, Person::getData)); 
        }
    }

    收集成实体本身map

    代码如下:

    accounts.stream().collect(Collectors.toMap(Account::getId, account -> account)); 

    account -> account是一个返回本身的lambda表达式,其实还可以使用Function接口中的一个默认方法代替,使整个方法更简洁优雅:

    accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity())); 

    重复key的情况

    代码如下:

    accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity())); 

    这个方法可能报错(java.lang.IllegalStateException: Duplicate key),因为name是有可能重复的。toMap有个重载方法,可以传入一个合并的函数来解决key冲突问题:

    accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));

    这里只是简单的使用后者覆盖前者来解决key重复问题。

    指定具体收集的map

    toMap还有另一个重载方法,可以指定一个Map的具体实现,来收集数据:

    accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new))

    5.FilterMap操作

    public class ExampleFilterMap {
        private static Map<Integer,String> map_ = Maps.newHashMap();
        static{
            map_.put(1, "linode.com");
            map_.put(2, "heroku.com");
            map_.put(3, "digitalocean.com");
            map_.put(4, "aws.amazon.com");
        }
        public static void main(String[] args) {
            //before java iterator map
            String result = null;
            for(Map.Entry<Integer,String> entry:map_.entrySet()){
                if("heroku.com".equals(entry.getValue())){
                    result = entry.getValue();
                }
            }
            System.out.println("Before Java 8 :" + result);
            //Java8 Map->Stream->Filter->String
            result =  map_.entrySet().stream().
                    filter(map->"heroku.com".equals(map.getValue()))
                    .map(map->map.getValue())
                    .collect(Collectors.joining());
            System.out.println("Java 8 :" + result);
           Map<Integer,String> collect =  map_.entrySet().stream()
                    .filter(c->c.getKey()==2)
                    .collect(Collectors.toMap(p->p.getKey(),p->p.getValue()));
            System.out.println(collect);
        }
    }
    

    6.Optional操作可以防止NullPointException

    Optional<String> optional = Optional.of("hello");
    System.out.println(optional.isPresent());//true
    System.out.println(optional.get());//hello
    System.out.println(optional.orElse("false"));
    optional.ifPresent((s)-> System.out.println(s.charAt(0)));//h

    7.给出一个详细的例子

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public class Employee {
        private String name;
        private int salary;
        private String office;
    }
    public class ExampleEmployee {
        private static List<Employee> employeeList = Lists.newArrayList();
        static{
            employeeList.add(Employee.builder().name("Matt").salary(5000).office("New York").build());
            employeeList.add(Employee.builder().name("Steve").salary(6000).office("London").build());
            employeeList.add(Employee.builder().name("Carrie").salary(20000).office("New York").build());
            employeeList.add(Employee.builder().name("Peter").salary(7000).office("New York").build());
            employeeList.add(Employee.builder().name("Pat").salary(8000).office("London").build());
            employeeList.add(Employee.builder().name("Tammy").salary(29000).office("Shanghai").build());
        }
        public static void main(String[] args) {
            //anyMatch
            boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));
            System.out.println(isMatch);
            //返回所有salary大于6000
            boolean matched = employeeList.stream().allMatch(employee -> employee.getSalary()>4000);
            System.out.println(matched);
            //找出工资最高
            Optional<Employee> hightestSalary = employeeList.stream().max((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
            System.out.println(hightestSalary);
            //返回姓名列表
            List<String> names = employeeList.stream().map(employee -> employee.getName()).collect(Collectors.toList());
            System.out.println(names);
            //List转换成Map
            Map<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));
            employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));
            //统计办公室是New York的个数
            long officeCount = employeeList.stream().filter(employee -> employee.getOffice().equals("Shanghai")).count();
            System.out.println(officeCount);
            //List转换为Set
            Set<String> officeSet = employeeList.stream().map(employee -> employee.getOffice()).distinct().collect(Collectors.toSet());
            System.out.println(officeSet);
            //查找办公室地点是New York的员工
            Optional<Employee> allMatchedEmployees = employeeList.stream().filter(employee -> employee.getOffice().equals("New York")).findAny();
            System.out.println(allMatchedEmployees);
            //按照工资的降序来列出员工信息
            List<Employee> sortEmployeeList =  employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());
            //按照名字的升序列出员工信息
            List<Employee> sortEmployeeByName = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
            System.out.println(sortEmployeeList);
            System.out.println("按照名字的升序列出员工信息:" + sortEmployeeByName);
            //获取工资最高的前2条员工信息
            List<Employee> top2EmployeeList= employeeList.stream()
                    .sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary()))
                    .limit(2)
                    .collect(Collectors.toList());
            System.out.println(top2EmployeeList);
            //获取平均工资
            OptionalDouble averageSalary = employeeList.stream().mapToInt(employee->employee.getSalary()).average();
            System.out.println("平均工资:" + averageSalary);
            //查找New York
            OptionalDouble averageSalaryByOffice = employeeList.stream().filter(employee -> employee.getOffice()
                    .equals("New York"))
                    .mapToInt(employee->employee.getSalary())
                    .average();
            System.out.println("New York办公室平均工资:" + averageSalaryByOffice);
        }
    }
    

    8.Java8常见操作

    
    public class EmployeeTest {
        public static List<Employee> generateData() {
            return Arrays.asList(new Employee("Matt", 5000, "New York"),
                    new Employee("Steve", 6000, "London"),
                    new Employee("Carrie", 10000, "New York"),
                    new Employee("Peter", 7000, "New York"),
                    new Employee("Alec", 6000, "London"),
                    new Employee("Sarah", 8000, "London"),
                    new Employee("Rebecca", 4000, "New York"),
                    new Employee("Pat", 20000, "New York"),
                    new Employee("Tammy", 9000, "New York"),
                    new Employee("Fred", 15000, "Tokyo"));
        }
        public static Map<String, Integer> generateMapData() {
            Map<String, Integer> items = Maps.newHashMap();
            items.put("A", 10);
            items.put("B", 20);
            items.put("C", 30);
            items.put("D", 40);
            items.put("E", 50);
            items.put("F", 60);
            return items;
        }
        @Test
        public void testEmployee() {
            List<Employee> results = generateData();
            //打印出名字是Steve的员工信息
            results.forEach(c -> {
                if (c.getName().equals("Steve")) {
                    System.out.println(c);
                }
            });
            System.out.println("---------");
            //找出年薪超过6000的员工
            results.stream().filter(c -> c.getSalary() >= 60000).forEach(c -> System.out.println(c));
            System.out.println("--->>>>>>----");
            //java8遍历map
            Map<String, Integer> map_ = generateMapData();
            map_.forEach((key, value) -> System.out.println("key:" + key + "," + "value:" + value));
            System.out.println("---->>>>分组>>>-----");
            //java8 分组操作
            Map<String, List<Employee>> groupMap = results.stream().collect(Collectors.groupingBy(c -> c.getOffice()));
            System.out.println(groupMap);
            System.out.println("---->>>>List转化为Map>>>----");
            //List转化Map
            Map<String, Object> map = results.stream().collect(Collectors.toMap(Employee::getName, Employee::getOffice));
            map.forEach((key, value) -> System.out.println("key:" + key + "," + "value:" + value));
            System.out.println("---->>>>>>>----");
            Map<Integer, Employee> employeeMap = results.stream().collect(Collectors.toMap((key -> key.getSalary()), (value -> value)));
            employeeMap.forEach((key, value) -> System.out.println(key + "," + value));
            System.out.println("---->>遍历map>>>----");
            //打印出值大于30的map
            Map<String, Integer> resultMap = map_.entrySet().stream().filter(c -> c.getValue() > 30).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
            resultMap.forEach((key, value) -> System.out.println(key + "=" + value));
            System.out.println(">>>>>>>>>>>>>>>");
            //打印key=D的map
            Map<String, Integer> mapResults = map_.entrySet().stream().filter(c -> c.getKey().equals("D")).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
            mapResults.forEach((key, value) -> System.out.println(key + ">>>>" + value));
            System.out.println(">>>>>>>Optional>>>>>>>");
            Optional<String> optional = Optional.of("hello");
            System.out.println(optional.isPresent());
        }
        @Test
        public void testEmployeeExample() {
            //anyMatch
            List<Employee> employeeList = generateData();
            boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));
            System.out.println(isMatch);
            //allMatch
            boolean matched = employeeList.stream().allMatch(employee -> employee.getOffice().equals("London"));
            System.out.println(matched);
            //找出工资最高的
            Optional<Employee> employeeOptional = employeeList.stream().max((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
            System.out.println(employeeOptional);
            //找出工资最少的
            Optional<Employee> employee = employeeList.stream().min((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
            System.out.println(employee);
            //返回姓名列表
            List<String> names = employeeList.stream().map(c->c.getName()).collect(Collectors.toList());
            System.out.println(names);
            System.out.println(">>>>>>>>>>>");
            //List转化Map
            Map<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));
            employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));
            //统计办公室是New York的个数
            long officeCount =  employeeList.stream().filter(c->c.getOffice().equals("New York")).count();
            System.out.println(officeCount);
            long salaryCount = employeeList.stream().filter(c->c.getSalary()>60000).count();
            System.out.println(salaryCount);
            //List转化为Set
            Set<String> officeSet = employeeList.stream().map(c->c.getOffice()).distinct().collect(Collectors.toSet());
            System.out.println(officeSet);
            Set<Integer> salarySet = employeeList.stream().map(c->c.getSalary()).distinct().collect(Collectors.toSet());
            System.out.println(salarySet);
            //查找办公室地点是New York的员工
            Optional<Employee> optionals = employeeList.stream().filter(c->c.getOffice().equals("New York")).findAny();
            System.out.println(optionals);
            System.out.println(">>>>>工资降序排序>>>>>");
            //按照工资的降序来列出员工信息
            List<Employee> sortSalaryEmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());
            System.out.println(sortSalaryEmployeeList);
            System.out.println(">>>>>姓名升序排序>>>>>");
            List<Employee> sortNameEmployeeList = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
            System.out.println(sortNameEmployeeList);
            System.out.println(">>>>获取工资最高的前2条员工信息");
            List<Employee> dispaly2EmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).limit(2).collect(Collectors.toList());
            System.out.println(dispaly2EmployeeList);
            System.out.println(">>>>获取平均工资");
            OptionalDouble averageSalary = employeeList.stream().mapToInt(c->c.getSalary()).average();
            System.out.println(averageSalary);
            System.out.println(">>>>获取工作地点的平均工资");
            OptionalDouble optionalDouble = employeeList.stream().filter(c->c.getOffice().equals("New York")).mapToInt(c->c.getSalary()).average();
            System.out.println(optionalDouble);
            System.out.println(">>>>>>Java8 Optional用法>>>>>>");
            Optional<String> stringOptional = Optional.of("test");
            System.out.println(stringOptional.get());
            Optional<String> isOptional = Optional.ofNullable("hello");
            System.out.println(isOptional.isPresent());
            System.out.println(isOptional.get());
            System.out.println(isOptional.orElse("0"));
            System.out.println(">>>>>>>>>>>>");
            //Optional<String> optionalVal = Optional.of(null);
            // System.out.println(optionalVal);
            Optional<String> optional = Optional.ofNullable("optional");
            System.out.println(optional);
            System.out.println(optional.isPresent());
            System.out.println(optional.get());
            System.out.println(optional.orElse("haha"));
            System.out.println(">>>>>>>>>>>>");
            Optional<Employee> employeeOptional_ = employeeList.stream().filter(c->c.getOffice().equals("New York")).findFirst();
            System.out.println(employeeOptional_);
        }
    }
    
  • 相关阅读:
    wamp+phpzendstudio配置xdebug57%解决办法
    【linux学习问题解决】使用aptget安装软件出现unable to locate package的解决办法
    【linux LAMP平台安装】写在前面(一)
    【linux学习问题解决】更改字符界面大小(转)
    [phpcms二次开发]phpcms生成栏目出错,转到模版页面
    [phpcms二次开发]给url规则添加可用更多自定义可用变量
    [phpcms二次开发]实现获取路径linux与windows路径兼容
    控件注册 利用资源文件将dll、ocx打包进exe文件(转)
    C#串口通信:MSComm控件使用详解
    改善C#程序的建议1:非用ICloneable不可的理由
  • 原文地址:https://www.cnblogs.com/xmanblue/p/6287532.html
Copyright © 2011-2022 走看看