Java8新特性(Lamda、Stream、Option)

目录

Lamda

Stream

 ​编辑

Optional 

案例一:将一段字符串中的一部分进行排序


在Java8中,接口中的抽象方法默认被 public,abstract修饰符修饰,在Java8之前不允许普通方法存在接口中,在java8之后接口中可以存在普通方法,但是必须被static或者default修饰。

Lamda

好处:简化匿名内部类的调用

规范:使用lamda表达式需要依赖函数式接口

  • 一个接口只有一个抽象方法
  • 可以使用被static或者default修饰的方法
  • 接口被@FunctionalInterface修饰

例子

如果lamda表达式只有一个返回值可以不写大括号和return语句

 List<Integer> list = Arrays.asList(1, 3, 2, 9, 7);
 list.forEach(item-> System.out.println("我是"+item));
 Collections.sort(list,(o1,o2)->{return o2-o1;});
 System.out.println(list);

Stream

 

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

        //获取集合中大于2、并且经过排序、平方去重的有序集合
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        List<Integer> collect = numbers.stream()
                .filter(item -> item > 2)
                .sorted((o1, o2) ->{return o2.compareTo(o1);})
                .map(i -> i * i)
                .distinct()
                .collect(Collectors.toList());
        System.out.println(collect);
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;
 
public class Java8Tester {
   public static void main(String args[]){

      System.out.println("使用 Java 8: ");
      System.out.println("列表: " +strings);
        
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("空字符串数量为: " + count);
        
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("字符串长度为 3 的数量为: " + count);
        
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("筛选后的列表: " + filtered);
        
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("合并字符串: " + mergedString);
        
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("列表: " +integers);
        
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
        
      System.out.println("列表中最大的数 : " + stats.getMax());
      System.out.println("列表中最小的数 : " + stats.getMin());
      System.out.println("所有数之和 : " + stats.getSum());
      System.out.println("平均数 : " + stats.getAverage());
      System.out.println("随机数: ");
        
      random.ints().limit(10).sorted().forEach(System.out::println);
        
      // 并行处理
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("空字符串的数量为: " + count);
   }
   
}

使用 Java 8: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符串数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9.444444444444445
随机数: 
-1743813696
-1301974944
-1299484995
-779981186
136544902
555792023
1243315896
1264920849
1472077135
1706423674
空字符串的数量为: 2

Optional 

import java.util.Optional;
 
public class Java8Tester {
   public static void main(String args[]){
   
      Java8Tester java8Tester = new Java8Tester();
      Integer value1 = null;
      Integer value2 = new Integer(10);
        
      // Optional.ofNullable - 允许传递为 null 参数
      Optional<Integer> a = Optional.ofNullable(value1);
        
      // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
      Optional<Integer> b = Optional.of(value2);
      System.out.println(java8Tester.sum(a,b));
   }
    
   public Integer sum(Optional<Integer> a, Optional<Integer> b){
    
      // Optional.isPresent - 判断值是否存在
        
      System.out.println("第一个参数值存在: " + a.isPresent());
      System.out.println("第二个参数值存在: " + b.isPresent());
        
      // Optional.orElse - 如果值存在,返回它,否则返回默认值
      Integer value1 = a.orElse(new Integer(0));
        
      //Optional.get - 获取值,值需要存在
      Integer value2 = b.get();
      return value1 + value2;
   }
}

运行结果:

$ javac Java8Tester.java 
$ java Java8Tester
第一个参数值存在: false
第二个参数值存在: true
10

案例一:将一段字符串中的一部分进行排序

 public static void main(String[] args) {
        String str = "2-5-4-3-8-9";
        Integer[] integers = Arrays.stream(str.split("-"))
                .map(Integer::parseInt)
                .sorted()
                .toArray(Integer[]::new);
        String s = Arrays.toString(integers).replaceAll(",", "-");
        String substring = s.substring(1, s.length() - 1);
        System.out.println(substring);
    }

案例二:查询list集合中性别时女的数据,如果为空要输出默认值

public static void main(String[] args) {
            List<UserEntity> userEntityList = new ArrayList<>();
            UserEntity userEntityDefault = new UserEntity();
            userEntityList.add(new UserEntity("1", "111", "male"));
            userEntityList.add(new UserEntity("2", "222", "female"));
            userEntityList.add(new UserEntity("3", "333", "male"));
            userEntityList.add(new UserEntity("4", "444", "female"));
            UserEntity userEntity1 = userEntityList.stream().filter(s-> Objects.equals(s.getO3(), "male")).findFirst().orElse(userEntityDefault);
            System.out.println(userEntity1);
    }

案例三

public  class Trader{

    private String name;
    private String city;

    public Trader(String n, String c){
        this.name = n;
        this.city = c;
    }

    public String getName(){
        return this.name;
    }

    public String getCity(){
        return this.city;
    }

    public void setCity(String newCity){
        this.city = newCity;
    }

    public String toString(){
        return "pojo1.Trader:"+this.name + " in " + this.city;
    }
}
public class Transaction{

    private Trader trader;
    private int year;
    private int value;

    public Transaction(Trader trader, int year, int value)
    {
        this.trader = trader;
        this.year = year;
        this.value = value;
    }

    public Trader getTrader(){
        return this.trader;
    }

    public int getYear(){
        return this.year;
    }

    public int getValue(){
        return this.value;
    }

    public String toString(){
        return "{" + this.trader + ", " +
                "year: "+this.year+", " +
                "value:" + this.value +"}";
    }
}

 

public class Test {
    public static void main(String[] args) {
        Trader raoul = new Trader("Raoul", "Cambridge");
        Trader mario = new Trader("Mario","Milan");
        Trader alan = new Trader("Alan","Cambridge");
        Trader brian = new Trader("Brian","Cambridge");

        Transaction transaction2 = new Transaction(brian, 2011, 300);

        List<Transaction> transactions = Arrays.asList(
                new Transaction(brian, 2011, 300),
                new Transaction(raoul, 2012, 1000),
                new Transaction(raoul, 2011, 400),
                new Transaction(mario, 2012, 710),
                new Transaction(mario, 2012, 700),
                new Transaction(alan, 2012, 950)
        );
        //找出2011年发生的所有交易,并按交易额排序
        List<Transaction> collect = transactions.stream().filter(transaction -> transaction.getYear() == 2011).sorted((o1,o2)->o1.getYear()-o2.getYear()).collect(Collectors.toList());
        System.out.println(collect);
        //交易员在哪些不同的城市工作过
        List<String> collect1 = transactions.stream().map(transaction -> transaction.getTrader().getCity()).distinct().collect(Collectors.toList());
        System.out.println(collect1);
        //查找所有来自剑桥的交易员,并按姓名进行排序并且通过字符串连接返回
        String cambridge = transactions.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge")).map(o1 -> o1.getTrader().getName()).distinct().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.joining(", "));
        System.out.println(cambridge);
        //有没有交易员在米兰工作
        /**
         * anyMatch表示,判断的条件里,任意一个元素成功,返回true
         *
         * allMatch表示,判断条件里的元素,所有的都是,返回true
         *
         * noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true
         */
        Boolean milanTrader = transactions.stream().anyMatch(transaction ->transaction.getTrader().getCity().equals("milan"));
        System.out.println(milanTrader);
        //打印生活在剑桥的交易员的所有交易额
        transactions.stream().filter(transaction -> transaction.getTrader().getCity().equals("Cambridge")).forEach(o1-> System.out.println(o1.getValue()));

        //所有交易中,最高的交易额是多少
        Optional<Integer> maxValue = transactions.stream()
                .map(Transaction::getValue)
                .distinct()
                .reduce(Integer::max);
        System.out.println(maxValue);

        //最小交易额
        Integer integer = transactions.stream()

                .map(o1 -> o1.getValue())

                .distinct()

                .reduce(Integer::min).get();
//        Optional<Integer> minValue = (Optional<Integer>) integer

        System.out.println(integer);


        //将一段字符串中的一部分进行排序
        String str = "2-5-4-3-8-9";
        String collect2 = Arrays.stream(str.split("-")).sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.joining(","));

        //
        Transaction transaction3 = transactions.stream().filter(transaction -> transaction.getYear() == 2000).findFirst().orElse(transaction2);
        System.out.println(transaction3);


    }
}
[{pojo1.Trader:Brian in Cambridge, year: 2011, value:300}, {pojo1.Trader:Raoul in Cambridge, year: 2011, value:400}]
[Cambridge, Milan]
Alan, Brian, Raoul
false
300
1000
400
950
Optional[1000]
300
{pojo1.Trader:Brian in Cambridge, year: 2011, value:300}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值