java8的总体思想就是局部逻辑功能包,这个功能包可以直接使用或者代表一个有此功能包的对象,1可以简化书写,2重用性,组合性灵活性高
lamd表达式和::都是返回一个方法过程对象,不是运算结果,类似回调的思想
可重复注解(一个类用多个类似注解组合)
1,lambda表达式定义的是一个接口(根据上下文可知)中的一个函数具体逻辑,整个表达式当接口的对象用(new),这是lambda方式之一
第二种用于功能打包的工具(Predicate,Functions,Suppliers,Consumers),工具中不再是事先像常规接口定义好的一个形式的方法,这种工具中的接口方法可以是任意形式,具体根据是定义工具时的lambda表达式定
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted); // 123
注意,如果你不写@FunctionalInterface 标注,程序也是正确的。
2,用::引用内部构造方法或返回者内部方法的引用(不是结果)(引用是传递的是这个函数逻辑用的是这个函数,调用是调用这个方法直接用结果)
引用构造方法的时候根据后面这个对象调用方法是传递的参数形式同时决定调用什么形式的构造方法
class Something {
String startsWith(String s) {
return String.valueOf(s.charAt(0));
}
}
Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted); // "J"
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker"); ----引用构造方法的时候根据后面这个对象调用方法是传递的参数形式同时决定调用什么形式的构造方法
3,lambda表达式可以访问外部的局部变量,不管是否final都会编译的时候当做final处理,但是不可以改变局部变量的值,但是
对于类级别的成员变量可以改变值,lambda不可以访问默认接口方法 ,方式的任何实例是可以的
4,Predicate 可自定义判断逻辑的判断工具类,程序中直接用其判断
and表示系列条件组合,test表示直接返回这个条件返回的结果
int[] numbers= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
List<Integer> list=new ArrayList<>();
for(int i:numbers) {
list.add(i);
}
Predicate<Integer> p1=i->i>5;
Predicate<Integer> p2=i->i<20;
Predicate<Integer> p3=i->i%2==0;
List test=list.stream().filter(p1.and(p2).and(p3)).collect(Collectors.toList());
System.out.println(test.toString());
5, Functions 可自定义的逻辑的工具类
下面定义了逻辑1,Integer::valueOf 逻辑2,String::valueOf,后面apply的是时候就依次执行这个逻辑组合
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);
backToString.apply("123"); // "123"
6,Suppliers 返回给定类型的结果,一般用于返回对象
Supplier<Person> personSupplier = Person::new; ---由后面的get()知,就是无参数的构造方方法的引用,由get触发
personSupplier.get(); // new Person
7,Consumers 类似Functions也是打包一个功能,只是这个功能是有参数的,由accept触发
Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));
8,Comparators 这个工具类就相对于固定,即你传入的lambda只能是2个参数的
Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);
Person p1 = new Person("John", "Doe");
Person p2 = new Person("Alice", "Wonderland");
comparator.compare(p1, p2); // > 0
comparator.reversed().compare(p1, p2); // < 0
9,Optionals 为了防止空指针,把结果给Optional对象,这个Optional始终不会是空,真正的数据放在get()中,ifPresent的时候直接用get()获取的值操作
Optional<String> optional = Optional.of("bam");
optional.isPresent(); // true
optional.get(); // "bam"
optional.orElse("fallback"); // "bam"
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b"
10,可重复注解(注解数组,列表)
@interface Hints {
Hint[] value();
}
@Repeatable,Java 8 允许我们对同一类型使用多重注解:
@Repeatable(Hints.class)
@interface Hint {
String value();
}
变体1:使用注解容器(老方法):
Java代码
@Hints({@Hint("hint1"), @Hint("hint2")})
class Person {}
变体2:使用可重复注解(新方法):
Java代码
@Hint("hint1")
@Hint("hint2")
class Person {}
java编译器能够在内部自动对@Hint进行设置。这对于通过反射来读取注解信息来说,是非常重要的。 在实际中子注解会关联上父注解的信息
Hint hint = Person.class.getAnnotation(Hint.class);
System.out.println(hint); // null
Hints hints1 = Person.class.getAnnotation(Hints.class);
System.out.println(hints1.value().length); // 2
Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class);
System.out.println(hints2.length); // 2
尽管我们绝对不会在Person类上声明@Hints注解,但是它的信息仍然可以通过getAnnotation(Hints.class)来读取。
并且,getAnnotationsByType方法会更方便,因为它赋予了所有@Hints注解标注的方法直接的访问权限。
参考:
https://www.iteye.com/magazines/129-Java-8-Tutorial
相关推荐
支持类型大致有六种: int char byte short String(java 7才允许) 枚举 常见的boolean与实数性不支持 JAVA何种情况下需要强制类型转换 父类转换为子类时 基本数据类型长度不一,由长度长的向长度短的数据转换或者...
根据提供的文件信息,我们可以归纳出一系列与Java编程相关的知识点,主要涵盖了从基本概念到高级主题的广泛内容。接下来,我们将对这些知识点进行详细的解析。 ### 1. Java学习指南概览 #### 1.1 欢迎词与介绍 ...
### 学习方法归纳——Java学习策略 #### 标题解析 标题“学习方法归纳”指的是一种系统化的学习方式汇总,旨在帮助学习者高效掌握某一领域的知识与技能。本篇着重于Java编程语言的学习方法。 #### 描述解析 描述中...
根据提供的文件信息,我们可以归纳出一系列与Java基础知识相关的学习要点。虽然无法直接访问所提供的链接查看具体视频内容,但根据标题“JAVA基础视频连接”、描述中的“完整的java基础教学视频,一共14章”以及标签...
如图1-13所示,即使显示的版本信息与实际安装的不完全一致,只要大致符合,就说明安装成功。 总结来说,安装JDK 1.7主要涉及下载安装文件、运行安装程序、选择安装组件、配置环境变量以及验证安装效果。正确完成...
由于文档中存在扫描错误,一些信息可能被误解或遗失,但以上根据现有信息归纳出的知识点大致涵盖了Java语言的入门和应用基础。对于学生来说,通过课后习题和参考答案来学习源代码是很好的实践方式。对于自学者来说,...
iReport 最全打印归纳 iReport 是一个基于 Java 语言编写的报表引擎,用户可以按照它制定的规则编写一个 XML 文件,生成各种格式的文件,包括 PDF、HTML、XML、XLS、CSV 等。iReport 是报表的设计部分,界面设计是...
根据提供的文件信息,我们可以归纳和展开以下几个相关的IT知识点: ### 1. Java 课程设计的目标与意义 #### 深化理论理解 - **计算机语言基础概念**:学习编程语言的基本构成元素,如变量、数据类型、控制结构等。...
根据提供的文件信息,我们可以归纳出该书《数据结构与算法分析_java语言描述》的主要知识点及其相关内容。本书由Mark Allen Weiss撰写,是计算机科学领域内学习数据结构与算法的经典教材之一。接下来,我们将按照各...
### 计算机组成原理知识归纳总结 #### 一、计算机发展历程及层次结构 ##### 计算机发展历程 从计算机的诞生至今,大致经历了四个重要的发展阶段: 1. **第一代电子管计算机**(1946-1958年左右):采用电子管...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 知识点一:编写整洁代码的重要性 编写整洁的代码对于软件开发来说至关重要。这不仅能够提高代码的可读性和可维护性,还能够减少错误的发生概率,...
在Drools中,规则引擎的工作流程大致如下: 1. 初始化事实:将数据输入到工作内存(Working Memory)。 2. 匹配规则:规则引擎检查规则是否与工作内存中的事实相匹配。 3. 冲突解决:如果多个规则同时匹配,Drools会...
递归算法简洁明了,常用于解决具有递归性质的问题,如树的遍历、图的遍历、数学归纳法等。 #### 模式 设计模式是在软件设计过程中解决常见问题的有效方法。 ##### 1. 设计模式的分类及每种类型的作用 设计模式...
归纳整理了蛮大一部分的学习笔记,很多方向都有,很多都浅尝辄止。 大方向 包含的小版块 学习程度 前端方向 前端基础,Angularjs,Vue,React,前端工程化,CSS预先 大致详细 重点方向 ThinkPHP,JavaWeb,Mybatis,...
通过查看这些jar文件,可以大致了解项目所依赖的第三方库和技术栈,比如Spring、Hibernate等。 #### 四、页面脚本语言识别 - **Scriptlet语言**:观察页面中的`<% %>`标签内的脚本片段,可以帮助判断页面使用的脚本...
根据提供的文件信息,我们可以归纳出一系列关于Azkaban操作指南的关键知识点。Azkaban是一款用于批量处理工作流任务调度的工具,在数据处理、ETL(提取、转换、加载)流程中有着广泛的应用。下面我们将详细介绍如何...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 一、HttpClient简介 `HttpClient`是Apache HttpClient项目的一部分,主要用于发起HTTP请求并处理响应。它为Android和其他Java平台提供了高级别的...
根据提供的文件信息,我们可以归纳出以下几个关键的知识点: ### 一、MyEclipse 6.5.0 GA 版本介绍 #### 1.1 MyEclipse 软件概述 MyEclipse 是一款功能强大的集成开发环境(Integrated Development Environment,...