Supplier

1,

@FunctionalInterface
public interface Supplier<T> {

2,    T get();

3,

Supplier<Apple> c1 = Apple::new
Apple a1 = c1.get();

consumer接口

1,

@FunctionalInterface
public interface Consumer<T> {

2,void accept(T t);

3,主要用来输出的

function 接口

1,public interface Function<T, R> {

2,T apply(F input);

3,主要是用来转换东西的

4,函数复合,

  • andThen    f.andThen(g)    数学上会写作g(f(x))
  • compose   f.compose(g);   数学上会写作f(g(x))

Predicate接口

1,充当一个参数化的返回Boolean比较方法

2,public interface Predicate<T> {

3,boolean test(T t);

4,能动态替换返回boolean的函数

5,基本类型装箱问题,

DoublePredicate
boolean test(double value);//有对应的原始类型特化接口

6,谓词复合,优先级从左到右a.or(b).and(c)  ==  (a || b )&& c

  • negate()
  • and()
  • or()

lambda用法

1,

2,

3,

4,基本lambda语法

5,基本用法

6,在面向资源编程的lambda,不需要重复打开资源和关闭资源

7,lambda也有匿名函数的问题

8,方法引用

  • 静态方法引用,(例如Integer的parseInt方法,写作Integer::parseInt)。
  • 实例方法引用,(例如String的length,String::length
  • 方法体里面的方法引用,进一步的方法引用

9,比较器复合

  • 翻转:list.sort(comparing(Object::getXXX).reveserd());
  • 同样的时候添加第二个比较器,第二个是comparator类型, list.sort(Comparator.comparing(Integer::intValue).reversed().thenComparing(Integer::compareTo));

stream

1,更加简单的利用多cpu

2,基本概念

 流是“从支持数据处理操作的源生成的一系列元素”。
 流利用内部迭代:迭代通过filter、map、sorted等操作被抽象掉了。
 流操作有两类:中间操作和终端操作。
 filter和map等中间操作会返回一个流,并可以链接在一起。可以用它们来设置一条流 水线,但并不会生成任何结果。
 forEach和count等终端操作会返回一个非流的值,并处理流水线以返回结果。  流中的元素是按需计算的。
3,filter,筛选和切片
4,limit,skip
5,map,映射
  • flatMap

6,查找和匹配

  • anyMatch方法返回一个boolean,因此是一个终端操作。
    if(menu.stream().anyMatch(Dish::isVegetarian)){
    System.out.println("The menu is (somewhat) vegetarian friendly!!"); }  

  • allMatch方法的工作原理和anyMatch类似,但它会看看流中的元素是否都能匹配给定的谓
  boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); 
  • 和allMatch相对的是noneMatch。
  boolean isHealthy = menu.stream()

  .noneMatch(d -> d.getCalories() >= 1000);

  • findFirst和findAny

7,归约

  • reduce ,

    累加:int sum = numbers.stream().reduce(0, Integer::sum);

   最大最小值:Optional min = numbers.stream().reduce(Integer::min);

8,并发的有状态和无状态

9,优化自动装箱,

  • int calories = menu.stream()  .mapToInt(Dish::getCalories)  .sum();
  • 自动装箱

    IntStream intStream = menu.stream().mapToInt(Dish::getCalories)
    Stream<Integer> stream = intStream.boxed();

10,小结

11,collect

Java8其他

1,default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {

  可以添加默认实现

2,在 java8 中的接口中不仅增加了默认方法,还增加了静态方法。使用方式接口名.方法名。

3,

@FunctionalInterface
public interface Runnable {表明是个函数接口

Java8重构小实例

1,策略模式,类似predicate替换策略

2,模板方法,

3,观察者模式,注册的时候写上方法

4,责任链模式,在注册的时候像观察者模式差不多

5,传统简单工厂,用map和supplier

Java8实战,的更多相关文章

  1. java8实战:filter的简单使用

    <JAVA8实战>中的例子 要实现的功能:通过Apple的color或weight属性,对List<Apple>进行筛选. 1.首先定义com.owl.entity.Apple ...

  2. Java8实战及自己的总结

    java8 介绍 java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特性, ...

  3. Java8实战——自己的总结

    java8 介绍   java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特 ...

  4. Java8实战分享

    虽然很多人已经使用了JDK8,看到不少代码,貌似大家对于Java语言or SDK的使用看起来还是停留在7甚至6. Java8在流式 or 链式处理,并发 or 并行方面增强了很多,函数式的风格使代码可 ...

  5. Java的演化-Java8实战笔记

    一个语言要想一直有活力,它也需要跟随着时代的变化去进步,Java作为一个古老的语言,它其实有太多的历史包袱,在改变的过程中需要考虑很多,但是它也在慢慢的演变,巩固自己的城墙,不让自己被遗忘在历史中(不 ...

  6. java8实战二------lambda表达式和函数式接口,简单就好

    一.Lambda 可以把Lambda表达式理解为简洁地i表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还是一个可以抛出的异常列表. 听上去,跟我们用的匿名类,匿名 ...

  7. java8实战一------解决冗杂,java8真的很便利(抛砖)

    你的代码很容易因为需求而变化,对自己代码改来改去的你一定会觉得烦的.在我看来,java8很容易的解决了这个问题. 先来看看例子!在一堆苹果里,筛选绿色的苹果.当然,Apple类是这样子. class ...

  8. Java8实战系列一

    从java7到java8,最主要的变化可以总结为 □Lambda表达式 □ 方法引用 □流和默认方法 让我们通过一个小例子感受一下 情景 1 集合对象排序 (对list中的苹果按照重量排序) Coll ...

  9. 读书笔记,《Java8实战》第一章,为什么要关心 Java8

       开篇作者就提出,Java8所做的改变在许多方面比java历史上任何一次改变都深远.而且好消息是,这些改变会让你编辑程序来更容易,再也不用写类似类似于以前的swing中的事件处理函数的啰嗦代码了. ...

随机推荐

  1. Linux基础-09-磁盘分区、挂载及文件系统管理

    1. 硬件设备与文件名的对应关系 1) 在Linux系统中,每个设备都被当初一个文件来对待. 2) 各种设备在Linux中的文件名 2. 硬盘的结构及硬盘分区 1) 为什么要进行硬盘分区: a) 更容 ...

  2. 17. Scala泛型、上下界、视图界定、上下文界定

    17.1 泛型的基本介绍 17.1.1 基本介绍 1) 如果我们要求函数的参数可以接受任意类型,可以使用泛型,这个类型可以代表任意的数据类型 2) 例如List,在创建List时,可以传入整型.字符串 ...

  3. PB之取下来列修改后的值(AcceptText)

    AcceptText()功能 将“漂浮”在数据窗口控件上编辑框的内容放入到数据窗口控件的当前项中(主缓区中).在将数据放入到当前项之前,编辑框中的数据必须通过有效性规则检查语法  dwcontrol. ...

  4. Eclipse RCP使用SWT.EMBEDDED方式显示batik的svgCanvas后窗口最大化变白问题

    // 设置svg组件一直动态(这一行代码导致了最大化变白的问题)svgCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);// 以下两行解决最大化变白 ...

  5. # RESTful登录(基于token鉴权)的设计实例

    使用场景 现在很多基于restful的api接口都有个登录的设计,也就是在发起正式的请求之前先通过一个登录的请求接口,申请一个叫做token的东西.申请成功后,后面其他的支付请求都要带上这个token ...

  6. c++智能指针介绍_补充

    不明白我做错了什么,这几天老婆给我冷战了起来,也不给我开视频让我看娃了..哎,心累!趁着今晚的一些空闲时间来对智能指针做个补充吧. 写完上篇“智能指针介绍”后,第二天上班途中时,突然一个疑问盘踞在心头 ...

  7. vmware vcsa-故障1

    1.重启vcsa后不能登陆webclient 做实验得时候重启vcsa后不能登陆 web client 开启vcsa直接进入命令模式,命令行登陆后提示:failed to connect  to se ...

  8. SQL Server2008导入导出数据库

    一.导出数据库 1.新建一个.bak的文本 右击数据库-->Tasks-->BackUp-->Remove原来的数据库-->Add后选择之前建立的.bak档 二.导入数据库 1 ...

  9. git clone github上的项目失败 RPC failed

    error: RPC failed; curl 18 transfer closed with outstanding read data remainingfatal: the remote end ...

  10. angular中控制器之间传递参数的方式

    在angular中,每个controller(控制器)都会有自己的$scope,通过为这个对象添加属性赋值,就可以将数据传递给模板进行渲染,每个$scope只会在自己控制器内起作用,而有时候需要用到其 ...