JDK 1.8的一些新特性

四大核心函数式接口(Consumer、Predicate、Supplier、Function),结合lambda表达式

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.function.Function;
  5. import java.util.function.Predicate;
  6. import java.util.function.Supplier;
  7. public class JDk18Demo {
  8. public static void main(String[] args) {
  9. // foreach();
  10. // function();
  11. supplier();
  12. predicate();
  13. }
  14. /**
  15. * Predicate接口:断言接口,断言可理解为测试的意思
  16. * 测试给定字符串列表中哪些字符串包含小写字母m
  17. */
  18. private static void predicate() {
  19. List<String> list = Arrays.asList("Mikey", "Lily", "Jimy", "Tom");
  20. // 有没有参数取决于接口中的方法有没有参数 boolean test(T t);
  21. List<String> results = filter(list, (str) -> str.contains("m"));
  22. results.forEach(System.out::println);
  23. }
  24. private static List<String> filter(List<String> list, Predicate<String> p) {
  25. List<String> results = new ArrayList<>();
  26. for (String str : list) {
  27. if (p.test(str)) {// 测试是否符合要求
  28. results.add(str);
  29. }
  30. }
  31. return results;
  32. }
  33. /**
  34. * Supplier接口:代表结果供应商
  35. */
  36. private static void supplier() {
  37. List<Integer> list = getNums(10, () -> (int) (Math.random() * 100));
  38. list.forEach(System.out::println);
  39. }
  40. // 获取num个随机数,由调用者给出具体实现
  41. private static List<Integer> getNums(int num, Supplier<Integer> sup) {
  42. List<Integer> list = new ArrayList<>();
  43. for (int i = 0; i < num; i++) {
  44. list.add(sup.get());
  45. }
  46. return list;
  47. }
  48. /**
  49. * Function<T, R>接口:表示接收一个参数并产生结果的函数
  50. */
  51. private static void function() {
  52. String s = strToUpp("lowercase", (str) -> str.toUpperCase());
  53. System.out.println(s);
  54. }
  55. // 将给定字符串转为大写,由调用者给出具体实现
  56. private static String strToUpp(String str, Function<String, String> f) {
  57. return f.apply(str);
  58. }
  59. /**
  60. * Consumer接口:消费者接口
  61. * jdk 1.8中的新的迭代方法
  62. */
  63. private static void foreach() {
  64. List<String> list = new ArrayList<>();
  65. list.add("Tom");
  66. list.add("Mikey");
  67. list.add("Lily");
  68. list.forEach((String s) -> {
  69. System.out.println(s);
  70. });
  71. // 只有一行代码,可简写为
  72. list.forEach(s -> System.out.println(s));
  73. // 进一步可用新语法写为
  74. list.forEach(System.out::println);
  75. }
  76. }

Java JDK1.8新特性之四大函数式接口的更多相关文章

  1. JAVA 8 主要新特性 ----------------(四)Lambda函数式接口

    一.什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口.  你可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法 ...

  2. java8新特性学习:函数式接口

    本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...

  3. Java8新特性探索之函数式接口

    一.为什么引入函数式接口 作为Java函数式编程爱好者,我们都知道方法引用和 Lambda 表达式都必须被赋值,同时赋值需要类型信息才能使编译器保证类型的正确性. 我们先看一个Lambda代码示例: ...

  4. 01 语言基础+高级:1-10 JDK8新特性_day12【函数式接口】

    day12[函数式接口] 主要内容自定义函数式接口函数式编程常用函数式接口 教学目标能够使用@FunctionalInterface注解能够自定义无参无返回函数式接口能够自定义有参有返回函数式接口能够 ...

  5. java8新特性 - 什么是函数式接口 @FunctionalInterface?

    什么是函数式接口 @FunctionalInterface 源码定义 /** * An informative annotation type used to indicate that an int ...

  6. Java——jdk1.5新特性

     /* * 可变参数:--一个方法的参数个数不固定. * 特点: *  只能出现在参数列表的最后. *  调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参 ...

  7. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  8. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  9. [转] Java 8的新特性

    简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子 ...

随机推荐

  1. Mybatis基于注解开启使用二级缓存

    关于Mybatis的一级缓存和二级缓存的概念以及理解可以参照前面文章的介绍.前文连接:https://www.cnblogs.com/hopeofthevillage/p/11427438.html, ...

  2. 4.HTML 常用标签及属性

    1. 链接 标签: <a></a> 属性: href:链接地址 target:打开方式 _blank:新标签页打开 _self:当前页面打开(默认) title:链接提示 2. ...

  3. mui初级入门教程(一)— 小白入手mui的学习路线

    文章来源:小青年原创发布时间:2016-05-15关键词:mui,html5+转载需标注本文原始地址:http://zhaomenghuan.github.io/#!/blog/20160515 写在 ...

  4. What code you will get when you create a wcf library

    创建wcf服务库的时候,系统自动生成的代码 // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”. [ServiceContract] publ ...

  5. Python 数字系列-数字格式化输出

    数字的格式化输出 问题 你需要将数字格式化后输出,并控制数字的位数.对齐.千位分隔符和其他的细节. 解决方案 格式化输出单个数字的时候,可以使用内置的 format() 函数,比如: >> ...

  6. webpack 常用配置

    webpack.config.js const path = require('path'); const webpack = require('webpack'); const htmlWebpac ...

  7. JS-DOM Event

    DOM Level 0 Events:绑定到 DOM 的属性上,找不到官方文档 DOM0 是在 W3C 进行标准备化之前出现的,实际上是未形成标准的试验性质的初级阶段的 DOM. var tdiv = ...

  8. 《STL源码剖析》——第四章、序列容器

     1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...

  9. python常用模块(3)

    hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通 ...

  10. TCL自动化之SSH交互式

    目前ssh工具很多,但是能够轻松运用到自动化脚本中,可以轻松适配任何环境,满足ssh交互式登录的tcl工具包很少 下面是个人在tcl自动化过程中比较满意的一款自动化脚本 通过使用管道方式分装plink ...