java8:(Lambda 表达式,Supplier,@FunctionalInterface,foreach(),Optional,Stream().collect,双冒号,joining,partitioningBy分区,collectingAndThen,filter())
1.Lambda 表达式:
引导:http://www.cnblogs.com/yulinfeng/p/8452379.html
DEMO1:
List<String> names1 = new ArrayList<String>();
names1.add("Google ");
names1.add("Runoob ");
names1.add("Taobao ");
names1.add("Baidu ");
names1.add("Sina "); List<String> names2 = new ArrayList<String>();
names2.add("Google ");
names2.add("Runoob ");
names2.add("Taobao ");
names2.add("Baidu ");
names2.add("Sina "); Compare tester = new Compare();
System.out.println("使用 Java 7 语法: "); tester.sortUsingJava7(names1);
System.out.println(names1);
System.out.println("使用 Java 8 语法: "); tester.sortUsingJava8(names2);
System.out.println(names2);
} // 使用 java 7 排序
private void sortUsingJava7(List<String> names){
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
} // 使用 java 8 排序
private void sortUsingJava8(List<String> names){
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
}
DEMO2:
final static String salutation = "Hello! "; public static void main(String args[]) {
Declare tester = new Declare(); // 类型声明
MathOperation addition = (int a, int b) -> a + b; // 不用类型声明
MathOperation subtraction = (a, b) -> a - b; // 大括号中的返回语句
MathOperation multiplication = (int a, int b) -> {
return a * b;
}; // 没有大括号及返回语句
MathOperation division = (int a, int b) -> a / b; // System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
// System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
// System.out.println("10 x 5 = " + tester.operate(10, 5,
// multiplication));
// System.out.println("10 / 5 = " + tester.operate(10, 5, division)); // 不用括号
// GreetingService greetService1 = message ->
// System.out.println("Hello " + message);
//
// // 用括号
// GreetingService greetService2 = (message) ->
// System.out.println("Hello " + message); // greetService1.sayMessage("Runoob");
// greetService2.sayMessage("Google"); // lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda
// 内部修改定义在域外的局部变量,否则会编译错误。
// GreetingService greetService1 = message ->
// System.out.println(salutation + message);
// greetService1.sayMessage("Runoob"); // 我们也可以直接在 lambda 表达式中访问外层的局部变量:
// final int num = 1;
// Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
// s.convert(2); // 输出结果为 3 //lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
// int num = 1;
// Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
// s.convert(2);
//num =2会报错 // 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
// String first = "";
// Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错 } public interface Converter<T1, T2> {
void convert(int i);
} interface MathOperation {
int operation(int a, int b);
} interface GreetingService {
void sayMessage(String message);
} private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
2.Supplier:
public class SupplierTest {
private int age; public SupplierTest() {
System.out.println(age);
} public static void main(String[] args) {
//创建Supplier容器,声明为SupplierTest类型,此时并不会调用对象的构造方法,即不会创建对象
Supplier<SupplierTest> s = SupplierTest::new;
//调用get()方法,此时会调用对象的构造方法,即获得到真正对象
s.get();
//每次get都会调用构造方法,即获取的对象不同
s.get();
} }
3.@FunctionalInterface
@FunctionalInterface标记在接口上,“函数式接口”是指仅仅只包含一个抽象方法的接口
(1)该注解只能标记在"有且仅有一个抽象方法"的接口上。
(2)JDK8接口中的静态方法和默认方法,都不算是抽象方法。
(3)接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
(4)该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
4.foreach()
package com.test; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class Other {
public static void main(String[] args) {
testForeach2();
} private static void testForeach2() {
List<String> items = new ArrayList<>();
items.add("A");
items.add("B");
items.add("C");
items.add("D");
items.add("E");
// items.forEach((x)->{System.out.println(x);});
// items.forEach(System.out::println);
// items.stream().filter(s->s.contains("B")).forEach(System.out::println); } private static void testForeach1() {
Map<String, Integer> items = new HashMap<>();
items.put("A", 10);
items.put("B", 20);
items.put("C", 30);
items.put("D", 40);
items.put("E", 50);
items.put("F", 60); items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v)); items.forEach((k,v)->{
System.out.println("Item : " + k + " Count : " + v);
if("E".equals(k)){
System.out.println("Hello E");
}
}); }
}
5.Optional:
package test; import java.util.Optional; public class Test1 {
public static void main(String[] args) {
Test1 java8Tester = new Test1();
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(a.ofNullable(3).orElse(2));
} 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;
} }
6.Stream().collect
7.双冒号
8.joining:
9.partitioningBy分区:
10.collectingAndThen:
<!-- https://mvnrepository.com/artifact/com.google.code.google-collections/google-collect -->
<dependency>
<groupId>com.google.code.google-collections</groupId>
<artifactId>google-collect</artifactId>
<version>snapshot-</version>
</dependency>
11.filter():
java8:(Lambda 表达式,Supplier,@FunctionalInterface,foreach(),Optional,Stream().collect,双冒号,joining,partitioningBy分区,collectingAndThen,filter())的更多相关文章
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- Java8 Lambda表达式(一)
目录 一.应用场景引入 优化一:使用策略模式 优化二:使用匿名内部类 优化三:使用Lambda表达式 优化四:使用Stream API 二.Lambda运算符和对应语法 语法格式 Lambda表达式需 ...
- java8 Lambda表达式的新手上车指南(1)
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- Java8 lambda表达式语法 1
本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化.本文是该系列的第一篇, ...
- JAVA8 lambda表达式权威教程!
Java 8新特性----Stream流 jdk8是Java 语言开发的一个主要版本,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等等.今天就重点介 ...
- Java8 Lambda表达式、函数式接口和方法引用
目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...
- java8 Lambda 表达式和函数式接口快速理解
前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明. Lambda 表达式 lambda 表达式其实就是使用了 ...
- java8 lambda 表达式详解
lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 可以将 lambda ...
- JAVA8之lambda表达式具体解释,及stream中的lambda使用
前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...
随机推荐
- 使用dsoframer演示ppt
优点: (1)不用直接打开PowerPoint (2)可以嵌入到Form中,那种先打开ppt然后将ppt嵌入到Form中的方式,会先打开PowerPoint 缺点: 很早就停止更新了.... 但是没 ...
- 二进制;16进制; Byte , Python的bytes类; Base64数据编码; Bae64模块;
参考:中文维基 二进制 位操作(wiki) Byte字节 互联网数据处理:Base64数据编码 Python的模块Base64 16进制简介 python: bytes对象 字符集介绍:ascii 二 ...
- ThinkPHP胜出Laravel 近4倍,主流框架性能测试
主流PHP框架性能非权威测试 作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情. 用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期 ...
- MySQL 关于视图的操作
-- 视图就是一条select 语句 执行后返回结果集,是一种虚拟表,是一个逻辑表 -- 方便操作,减少复杂的SQL语句,增加可读性,更加安全一些 create view demo_view as s ...
- hive优化方式总结
1. 多表join优化代码结构: select .. from JOINTABLES (A,B,C) WITH KEYS (A.key, B.key, C.key) where .... 关联条件相同 ...
- 【jqGrid】翻页获取选中的值
1.实现效果: 点击确定所选按钮之后,获取翻页选中的题库表号 2.关键代码 onSelectAll: function (aRowids, status) { }, onSelectRow: func ...
- 【Andriod-AlertDialog控件】 弹出对话框AlertDialog用法
Result: Code: import android.app.Activity; import android.app.AlertDialog; import android.content.Di ...
- node 打包内存溢出 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
electron-vue加载了地图 openLayer后,打包就包内存溢出 解决办法: "build": "node --max_old_space_size=4096 ...
- [Python之路] 日志操作
使用logging模块来写日志 日志直接输出到准备输出 import logging logging.basicConfig(level=logging.WARNING, format="% ...
- windows环境下,mysql的root密码丢失后重置方法
运行窗口输入 services.msc,检查mysql服务是否启动,如果启动手动停止或输入 net stop mysql 停止msyql服务. 打开cmd命令行,使用cd命令进入mysql 的bi ...