2019独角兽企业重金招聘Python工程师标准>>>

构造stream的几种方法:

经过list获得:

Arrays.asList(1, 2).stream();

经过数组:

int[] a = {1, 2, 3};
Arrays.stream(a);

使用stream初始化方法:

Stream.of(1,2,3);

stream拼接:

Stream.concat(stream1, stream2);

1.在接口中定义实现的方法

/**
 * 李阳
 * 2017-3-22 09:50:41
 * 接口中可定义实现的方法,实现类中只需要实现抽象方法
 */
public interface InterfaceDemo {double needActrulize(int a);/**
     * 接口中定义实现的方法,需要加上defaultstatic关键字
     * @param a
     * @return
     */
    default double needNotActrulize(int a) {return Math.random() - 0.99;}/**
     * 接口中定义实现的方法,需要加上defaultstatic关键字
     * @param a
     * @return
     */
    static double needNotActrulize1(int a) {return Math.random() - 0.99;}
}

2.使用lambda表达式

  • 集合排序
/**
 * 集合排序
 */
public void testDemo(){List<String> list = new ArrayList<>();list.add("abdf");list.add("cds");list.add("hdfsdf");list.add("bdfd");//从小到大排序
    list.stream().sorted((a,b)-> a.compareTo(b)).forEach(System.out::println);//从大到小排序
    list.stream().sorted((a,b)-> b.compareTo(a)).forEach(System.out::println);
}
  • 折叠操作
/**
 * @return void 返回类型
 * @Title: reduce
 * @Description: 折叠操作,接收多个值并返回一个值。类似于sumsvgmin。 求和操作
 * @author liyang
 */
@Test
public void reduce() {// 为每个订单加上12%的税 // 老方法:
    List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);List<Integer> costBeforeTax1 = Arrays.asList();double total = 0;for (Integer cost : costBeforeTax) {double price = cost + .12 * cost;total = total + price;}System.out.println("Total : " + total);// 新方法:
    double bill = costBeforeTax.stream().map((cost) -> cost + .12 * cost).reduce((sum, cost) -> sum + cost).get();System.out.println("Total : " + bill);// 0为默认值
    double a = costBeforeTax1.stream().reduce(0, (sum, cost) -> sum + cost);System.out.println("Total : " + a);double avg = costBeforeTax.stream().reduce((sum, cost) -> sum + cost).map(sum -> sum / costBeforeTax.size()).get();System.out.println("avg : " + avg);// 求平均值
    double avg1 = costBeforeTax.stream().mapToInt(e -> e).average().getAsDouble();System.out.println(avg1);long sum = costBeforeTax.stream().mapToLong(e -> e).sum();System.out.println(sum);int max = costBeforeTax.stream().mapToInt(e -> e).max().getAsInt();System.out.println(max);int min = costBeforeTax.stream().mapToInt(e -> e).min().getAsInt();System.out.println(min);}
  • 集合中每个元素用逗号分隔,返回字符串
/**
 * @return void 返回类型
 * @Title: reduce
 * @Description: 将字符串换成大写并用逗号链接起来
 * @author liyang
 */
@Test
public void userFunctionOnElement() {List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.", "Canada");String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));System.out.println(G7Countries);
}
  • 去重
/**
 * @return void 返回类型
 * @Title: getDistinctList
 * @Description:用所有不同的数字创建一个列表
 * @author liyang
 */
@Test
public void getDistinctList() {List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);List<Integer> distinct = numbers.stream().distinct().collect(Collectors.toList());System.out.printf("Original List : %s,  Square Without duplicates : %s %n", numbers, distinct);
}
  • 统计
/**
 * @return void 返回类型
 * @Title: getStatistic
 * @Description: 统计数据。 IntStreamLongStream DoubleStream 等流的类中,有个非常有用的方法叫做
 * summaryStatistics() 。可以返回
 * IntSummaryStatisticsLongSummaryStatistics 或者
 * DoubleSummaryStatistic
 * s,描述流中元素的各种摘要数据。在本例中,我们用这个方法来计算列表的最大值和最小值。
 * @param:IntSummaryStatistics
 * @author liyang
 */
@Test
public void getStatistic() {// 获取数字的个数、最小值、最大值、总和以及平均值
    List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);IntSummaryStatistics stats = primes.stream().mapToInt(x -> x).summaryStatistics();System.out.println("Highest prime number in List : " + stats.getCount());System.out.println("Lowest prime number in List : " + stats.getMin());System.out.println("Highest prime number in List : " + stats.getMax());System.out.println("Sum of all prime numbers : " + stats.getSum());System.out.println("Average of all prime numbers : " + stats.getAverage());
}
  • 匹配或包含操作
/**
 * 匹配或包含判断
 */
@Test
public void testMatch() {List<Integer> primes = Arrays.asList(1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29);//任一匹配(判断包含)
    boolean isTrue = primes.stream().anyMatch(x -> (x == 13));System.out.println(isTrue);//全部匹配
    isTrue = primes.stream().allMatch(x -> (x > 30));System.out.println(isTrue);//全不匹配(判断不包含)
    isTrue = primes.stream().noneMatch(x -> (x > 30));System.out.println(isTrue);
}
  • 过滤
List<String> list = Arrays.asList("abc","adc","bdd");
List list0 = list.stream().filter(x -> (x.startsWith("a"))).map(x->x).collect(Collectors.toList());
System.out.println(list);
System.out.println(list0);

结果如下:

[abc, adc, bdd]
[abc, adc]

  • 线程实现runnable接口
// Java 8之前:
new Thread(new Runnable() {@Override
    public void run() {System.out.println("Before Java8, too much code for too little to do");}
}).start();//Java 8方式:
new Thread(() -> System.out.println("In Java8, Lambda expression rocks !!")).start();//如果你的方法不对参数进行修改、重写,只是在控制台打印点东西的话,那么可以这样写:
() -> System.out.println("Hello Lambda Expressions");//如果你的方法接收两个参数,那么可以写成如下这样:
(int even, int odd) -> even + odd

多维分组统计:

Card(Long cardId, Integer statusFlag, Integer lockFlag)
List<Card> list = Arrays.asList(new Card(1l, 1, 1),new Card(1l, 1, 0),new Card(1l, 0, 1),new Card(1l, 0, 0),new Card(1l, 0, 0),new Card(1l, 0, 0),new Card(1l, 0, 0),new Card(1l, 0, 0),new Card(2l, 1, 1),new Card(2l, 1, 0),new Card(2l, 1, 0),new Card(2l, 1, 0),new Card(2l, 0, 1),new Card(2l, 0, 0),new Card(3l, 1, 1),new Card(3l, 1, 0),new Card(3l, 0, 1),new Card(3l, 0, 1),new Card(3l, 0, 0));//汇总统计
Integer count = list.size();
System.out.println(count);//按cardID统计
Map<Long, Long> map = list.stream().collect(Collectors.groupingBy(Card::getCardId, Collectors.counting()));
System.out.println(map);//按cardID,statusFlag统计
Map<Long, Map<Integer,Long>> map1 = list.stream().collect(Collectors.groupingBy(Card::getCardId,Collectors.groupingBy(Card::getStatusFlag,Collectors.counting())));
System.out.println(map1);//按cardID,statusFlag和lockFlag统计
Map<Long, Map<Integer, Map<Integer,Long>>> map2 = list.stream().collect(Collectors.groupingBy(Card::getCardId,Collectors.groupingBy(Card::getStatusFlag,Collectors.groupingBy(Card::getLockFlag,Collectors.counting()))));
System.out.println(map2);

结果如下:

19
{1=8, 2=6, 3=5}
{1={0=6, 1=2}, 2={0=2, 1=4}, 3={0=3, 1=2}}
{1={0={0=5, 1=1}, 1={0=1, 1=1}}, 2={0={0=1, 1=1}, 1={0=3, 1=1}}, 3={0={0=1, 1=2}, 1={0=1, 1=1}}}

转载于:https://my.oschina.net/kevin2kelly/blog/864531

java8 新特性实践相关推荐

  1. Java8 新特性之流式数据处理(转)

    转自:https://www.cnblogs.com/shenlanzhizun/p/6027042.html 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作 ...

  2. Java8新特性总结 - 序

        Java8已经正式发布很久了 , 从各项新特性来讲 , Java8无疑是重大的版本升级 . Orcale公司于2014年3月18日发布Java8 , 新增了非常多的特性 . 但时至今日 , 大 ...

  3. Java8新特性总结 -5.Stream API函数式操作流元素集合

    所有示例代码打包下载 : 点击打开链接 Java8新特性 : 接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/T ...

  4. java8新特性stream流

    参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...

  5. 放大招了,肝了一篇8万字的Java8新特性总结,赶快收藏

    大家好,我是冰河~~ 说实话,肝这篇文章花了我一个月的时间,关于Java8的新特性全在这儿了,建议先收藏后阅读. Java8有哪些新特性? 简单来说,Java8新特性如下所示: Lambda表达式 函 ...

  6. Java8新特性学习笔记

    Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...

  7. 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!

    写在前面 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*)  ,那什么是Stream API呢?Java8中 ...

  8. 【Java8新特性】浅谈方法引用和构造器引用

    写在前面 Java8中一个很牛逼的新特性就是方法引用和构造器引用,为什么说它很牛逼呢?往下看! 方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!这里需要注意的是:实现抽 ...

  9. java8新特性_Java8新特性之Date API|乐字节

    大家好,我是乐字节的小乐,上篇文章讲述了<Java8新特性之Optional>,接下来,小乐将接着讲述Java8新特性之Date API 2019日历 Java8之Date API Jav ...

  10. 魅族android p,2.Android P新特性实践-Slices

    Android P新特性实践-Slices 概述 在2018年谷歌I/O开发者大会上,谷歌发布了万众期待的Android最新版本-Android P.Slice作为Android P版本更新的一大功能 ...

最新文章

  1. python2 python3编码_Python2和Python3编码问题-从底层出发
  2. ckeditor 4.2.1_演示 ckeditor 上传插入图片
  3. .NET开发者常会忽略的几个错误
  4. c/c++文件操作之缓冲区
  5. MessageDigest
  6. 如何以应届生的身份进入阿里巴巴?
  7. UI设计新手该怎么求职 有没有UI面试必备攻略
  8. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学系学位设置
  9. 一文详解Type C-CC引脚的作用
  10. [React hooks] Antd Form: Instance created by `useForm` is not connected to any Form element.Forget t
  11. vue尚品汇商城项目-day04【29.加入购物车操作(难点)】
  12. Vim中快速定位到某一行的方法
  13. 【ICCV2019 reid】Self-training with progressive augmentation for unsupervised cross-domain person reid
  14. 序列化和json对比
  15. 爱尔康与好大夫在线达成合作​;武田达泽优获批进入中国 | 跨国药企在中国...
  16. bluetoothd Protocol not available解决方法
  17. k3595参数_场效应管 2SK3595-01MR,2SK3595,K3595
  18. 手把手教你实现商品数据包的生成和下载功能开发
  19. echarts副标题 富文本标签
  20. 4月,不要跳槽...

热门文章

  1. Atitit jsr规范有多少个  407个。Jsr规范大全
  2. Atitit.收银机小票打印功能的设计  java php c#.net版本
  3. atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
  4. Rust 中 Trait 的使用及实现分析
  5. CTO用“汉德公式”来定责,我大写的服!
  6. Julia : Jupyter notebook 中试玩Julia
  7. 资管新政:银行资产管理业务的转型与发展 -中国银行刘东海
  8. 阿里云正式发布云原生人才培养合作计划
  9. 您有一封阿里云自动化运维沙龙邀请函待查收
  10. 评人工智能如何走向新阶段?