利用jdk1.8新特性lamada表达式、stream流等尝试内部类简写、函数式接口的声明与调用、集合的输出|统计|创建|聚合等处理

作者: admin 分类: JAVA 发布时间: 2019-06-18 22:29  阅读: 165 views

JDK1.8已经出来很久了,但是依旧沿用jdk1.5的语法编码。感觉同事会鄙视我这个程序猿的,所以抽空简单的练习了下可能常用的一些功能点,作为记录。

 

1. 集合元素的遍历

	    List<String> list = Arrays.asList("Lucy","Lily","Tom","Jack","Jimy","Anny","Anco");
	    //旧
	    for(String s :list) {
	      System.out.println("循环输出集合数据(旧方式):"+s);
	    }
	    //新
	    System.out.println("新一");
	    list.forEach(v -> System.out.println(v));
	    System.out.println("新二");
	    list.forEach(System.out::println);  //::方法引用
	    System.out.println("转换后输出");
	    list.forEach(v -> Upper(v));  //  -> 左侧是参数,  右侧是表达式

输出如下:

循环输出集合数据(旧方式):Lucy
循环输出集合数据(旧方式):Lily
循环输出集合数据(旧方式):Tom
循环输出集合数据(旧方式):Jack
循环输出集合数据(旧方式):Jimy
循环输出集合数据(旧方式):Anny
循环输出集合数据(旧方式):Anco
新一
Lucy
Lily
Tom
Jack
Jimy
Anny
Anco
新二
Lucy
Lily
Tom
Jack
Jimy
Anny
Anco
转换后输出
convert:LUCY
convert:LILY
convert:TOM
convert:JACK
convert:JIMY
convert:ANNY
convert:ANCO

2.内部类的简写

	    Thread thread = new Thread(new Runnable() {
	      @Override
	      public void run() {
	        System.out.println("thread");
	      }
	    });
	    thread.start();
	    //新
	    new Thread(() -> System.out.println("lamada -> thread")).start();

3.内部类参数的使用

	    Comparator<Integer> com =  new Comparator<Integer>() {
	      @Override
	      public int compare(Integer o1, Integer o2) {
	        int res = 0;
	        if(o1 - o2 > 0) { res = 1;}
	        if(o1 - o2 < 0) { res = -1;}
	        return res;
	      }};
	    Comparator<Integer> Lamadacom = (x, y) -> {
	      return Integer.compare(x, y);
	    };
	    System.out.println("实现比较器接口的比较结果:"+com.compare(21, 45));
	    System.out.println("lamada表达式实现的结果:"+Lamadacom.compare(33, 67));

输出:

实现比较器接口的比较结果:-1
lamada表达式实现的结果:-1

4.函数式接口的声明与调用

  interface MathOperation {
     int operation(int a, int b);
  }
  interface GreetingService { //函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
     void sayMessage(String message);
  }
  private int operate(int a, int b, MathOperation mathOperation) {
     return mathOperation.operation(a, b);
  }


	    // 类型声明
	    MathOperation addition = (int a, int b) -> a + b;
	    // 不用类型声明
	    MathOperation subtraction = (a, b) -> a - b;
	    // 大括号中的返回语句
	    MathOperation multiplication = (int a, int b) -> {
	        return a * b;
	    };
	    // 没有大括号及返回语句
	    MathOperation division = (int a, int b) -> a / b;
	    System.out.println("10 + 5 = " + new LamadaTest().operate(10, 5, addition));
	    System.out.println("10 - 5 = " + new LamadaTest().operate(10, 5, subtraction));
	    System.out.println("10 x 5 = " + new LamadaTest().operate(10, 5, multiplication));
	    System.out.println("10 / 5 = " + new LamadaTest().operate(10, 5, division));
	    // 不用括号
	    GreetingService greetService1 = message -> System.out.println("Hello " + message);
	    // 用括号
	    GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
	    greetService1.sayMessage("Runoob");
	    greetService2.sayMessage("Google");

输出:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Runoob
Hello Google

5.map、统计、循环输出、新对象创建

      List<animals> pets = new ArrayList<animals>();
      pets.add(new animals("dog",11,"pet"));
      pets.add(new animals("cat",9,""));
      pets.add(new animals("duck",9,"meat"));
      System.out.println("过滤出age > 9的数据: " + pets.stream().filter(pet -> pet.age > 9).collect(Collectors.toList()));
      System.out.println("所有age的平均值为: " + pets.stream().mapToInt( pet -> pet.age).summaryStatistics().getAverage());
      System.out.println("过滤出belong不为null的数据:" + pets.stream().filter( pet -> (pet.belong != "")).count());
      System.out.println("所有属性为age的值+2后为:" + pets.stream().map(pet -> pet.age+2).collect(Collectors.toList()));
      System.out.println("循环输出所有animal对象:");
      pets.stream().forEach(System.out::println);
      pets.stream().forEach(pet -> pet.setBelong("no_no"));
      pets.stream().forEach(pet -> System.out.println("修改belong数据后循环输出:"+pet));
      List<Integer> ages= pets.stream().map(pet -> pet.age).collect(Collectors.toList());
      System.out.println("将age属性转化为集合输出:"+ages);
      Optional<Integer> max = pets.stream().map(pet -> pet.getAge()).reduce(Integer::max);
      System.out.println("获取所有数据中age最大的值:"+max.get());
      //创建新对象
      List<animals> new_pets = pets.stream().map(pet -> new animals(pet.getName(),pet.getAge(),pet.getBelong())).collect(Collectors.toList());
      System.out.println("创建一个新的animals对象: "+new_pets);
      //创建map对象
      Map<Object, Object> result1 = pets.stream().collect(Collectors.toMap(animals::getName,animals::getAge));
      System.out.println("将对象中属性封装为map对象: "+result1);

输出:

过滤出age > 9的数据: [animals [name=dog, age=11, belong=pet]]
所有age的平均值为: 9.666666666666666
过滤出belong不为null的数据:2
所有属性为age的值+2后为:[13, 11, 11]
循环输出所有animal对象:
animals [name=dog, age=11, belong=pet]
animals [name=cat, age=9, belong=]
animals [name=duck, age=9, belong=meat]
修改belong数据后循环输出:animals [name=dog, age=11, belong=no_no]
修改belong数据后循环输出:animals [name=cat, age=9, belong=no_no]
修改belong数据后循环输出:animals [name=duck, age=9, belong=no_no]
将age属性转化为集合输出:[11, 9, 9]
获取所有数据中age最大的值:11
创建一个新的animals对象: [animals [name=dog, age=11, belong=no_no], animals [name=cat, age=9, belong=no_no], animals [name=duck, age=9, belong=no_no]]
将对象中属性封装为map对象: {duck=9, cat=9, dog=11}

6.reduce处理

	    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
	    //未简化写法
	    int total = numbers.stream().reduce((a,b) -> {
	      return a+b;
	    }).get();
	    System.out.println("Integer集合的总和:"+total);
	    //简化写法,当表达式一行时,可以省去花括号+return
	    System.out.println("Integer集合的总和:"+numbers.stream().reduce((a,b) -> a+b).get());
	    System.out.println("Integer集合的乘机:"+numbers.stream().reduce((a,b) -> a*b).get());
Integer集合的总和:55
Integer集合的总和:55
Integer集合的乘机:3628800

 

全部测试代码如下:

package com.chl.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 *
 * 
 * @author chenhailong
 * @date 2019年5月21日 下午1:32:38 
 */
public class LamadaTest {

  /**
   * @param args
   */
  public static void main(String[] args) {
    
    /**
     * 集合元素的遍历
     */
//	    List<String> list = Arrays.asList("Lucy","Lily","Tom","Jack","Jimy","Anny","Anco");
//	    //旧
//	    for(String s :list) {
//	      System.out.println("循环输出集合数据(旧方式):"+s);
//	    }
//	    //新
//	    System.out.println("新一");
//	    list.forEach(v -> System.out.println(v));
//	    System.out.println("新二");
//	    list.forEach(System.out::println);  //::方法引用
//	    System.out.println("转换后输出");
//	    list.forEach(v -> Upper(v));  //  -> 左侧是参数,  右侧是表达式
    
    
    /**
     * 内部类的使用(线程)
     */
//	    Thread thread = new Thread(new Runnable() {
//	      @Override
//	      public void run() {
//	        System.out.println("thread");
//	      }
//	    });
//	    thread.start();
//	    //新
//	    new Thread(() -> System.out.println("lamada -> thread")).start();
    
    /**
     * 多个参数的使用
     */
//	    Comparator<Integer> com =  new Comparator<Integer>() {
//	      @Override
//	      public int compare(Integer o1, Integer o2) {
//	        int res = 0;
//	        if(o1 - o2 > 0) { res = 1;}
//	        if(o1 - o2 < 0) { res = -1;}
//	        return res;
//	      }};
//	    Comparator<Integer> Lamadacom = (x, y) -> {
//	      return Integer.compare(x, y);
//	    };
//	    System.out.println("实现比较器接口的比较结果:"+com.compare(21, 45));
//	    System.out.println("lamada表达式实现的结果:"+Lamadacom.compare(33, 67));
    
    
    /**
     * 函数式接口的声明与调用
     */
//	    // 类型声明
//	    MathOperation addition = (int a, int b) -> a + b;
//	    // 不用类型声明
//	    MathOperation subtraction = (a, b) -> a - b;
//	    // 大括号中的返回语句
//	    MathOperation multiplication = (int a, int b) -> {
//	        return a * b;
//	    };
//	    // 没有大括号及返回语句
//	    MathOperation division = (int a, int b) -> a / b;
//	    System.out.println("10 + 5 = " + new LamadaTest().operate(10, 5, addition));
//	    System.out.println("10 - 5 = " + new LamadaTest().operate(10, 5, subtraction));
//	    System.out.println("10 x 5 = " + new LamadaTest().operate(10, 5, multiplication));
//	    System.out.println("10 / 5 = " + new LamadaTest().operate(10, 5, division));
//	    // 不用括号
//	    GreetingService greetService1 = message -> System.out.println("Hello " + message);
//	    // 用括号
//	    GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
//	    greetService1.sayMessage("Runoob");
//	    greetService2.sayMessage("Google");
    
    
    /**
     * map、统计、循环输出、新对象创建
     * map用来归类,结果一般是一组数据,比如可以将list中的学生分数映射到一个新的stream中。
     * reduce用来计算值,结果是一个值,比如计算最高分。
     */
//      List<animals> pets = new ArrayList<animals>();
//      pets.add(new animals("dog",11,"pet"));
//      pets.add(new animals("cat",9,""));
//      pets.add(new animals("duck",9,"meat"));
//      System.out.println("过滤出age > 9的数据: " + pets.stream().filter(pet -> pet.age > 9).collect(Collectors.toList()));
//      System.out.println("所有age的平均值为: " + pets.stream().mapToInt( pet -> pet.age).summaryStatistics().getAverage());
//      System.out.println("过滤出belong不为null的数据:" + pets.stream().filter( pet -> (pet.belong != "")).count());
//      System.out.println("所有属性为age的值+2后为:" + pets.stream().map(pet -> pet.age+2).collect(Collectors.toList()));
//      System.out.println("循环输出所有animal对象:");
//      pets.stream().forEach(System.out::println);
//      pets.stream().forEach(pet -> pet.setBelong("no_no"));
//      pets.stream().forEach(pet -> System.out.println("修改belong数据后循环输出:"+pet));
//      List<Integer> ages= pets.stream().map(pet -> pet.age).collect(Collectors.toList());
//      System.out.println("将age属性转化为集合输出:"+ages);
//      Optional<Integer> max = pets.stream().map(pet -> pet.getAge()).reduce(Integer::max);
//      System.out.println("获取所有数据中age最大的值:"+max.get());
//      //创建新对象
//      List<animals> new_pets = pets.stream().map(pet -> new animals(pet.getName(),pet.getAge(),pet.getBelong())).collect(Collectors.toList());
//      System.out.println("创建一个新的animals对象: "+new_pets);
//      //创建map对象
//      Map<Object, Object> result1 = pets.stream().collect(Collectors.toMap(animals::getName,animals::getAge));
//      System.out.println("将对象中属性封装为map对象: "+result1);
      
	    /**
	     * reduce处理
	     */
	    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
	    //未简化写法
	    int total = numbers.stream().reduce((a,b) -> {
	      return a+b;
	    }).get();
	    System.out.println("Integer集合的总和:"+total);
	    //简化写法,当表达式一行时,可以省去花括号+return
	    System.out.println("Integer集合的总和:"+numbers.stream().reduce((a,b) -> a+b).get());
	    System.out.println("Integer集合的乘机:"+numbers.stream().reduce((a,b) -> a*b).get());
  }
  
  /**
   * 内部静态转化方法
   */
  public static void Upper(String str) {
    System.out.println("convert:"+str.toUpperCase());
  }
  
  /**
   * 函数式接口的示例代码
   */
  interface MathOperation {
     int operation(int a, int b);
  }
  interface GreetingService { //函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
     void sayMessage(String message);
  }
  private int operate(int a, int b, MathOperation mathOperation) {
     return mathOperation.operation(a, b);
  }

  /**
   * 创建动物对象,进行流的聚合等操作
   */
  static class animals{
    String name;
    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 String getBelong() {
      return belong;
    }
    public void setBelong(String belong) {
      this.belong = belong;
    }
    Integer age;
    String belong;
    animals(String name,Integer age,String belong){
      this.name = name;
      this.age = age;
      this.belong = belong;
    }
    @Override
    public String toString() {
      return "animals [name=" + name + ", age=" + age + ", belong=" + belong + "]";
    }
    
  }
}

 


   原创文章,转载请标明本文链接: 利用jdk1.8新特性lamada表达式、stream流等尝试内部类简写、函数式接口的声明与调用、集合的输出|统计|创建|聚合等处理

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读