java8-lamba表達式的使用-遁地龍卷風。本站提示廣大學習愛好者:(java8-lamba表達式的使用-遁地龍卷風)文章只能為提供參考,不一定能成為您想要的結果。以下是java8-lamba表達式的使用-遁地龍卷風正文
(-1)前言
學習lamba表達式是十分重要的,你會發現java變的可愛多了。
(0)函數式接口
只有一個方法的接口稱為函數式接口
JButton jButton = new JButton("123");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {}});
等同於
jButton.addActionListener(e->System.out.println("Hello world"));
jButton.addActionListener((e)->System.out.println("Hello world"));
jButton.addActionListener((ActionEvent e)->System.out.println("Hello world"));
jButton.addActionListener((ActionEvent e)->{System.out.println("Hello world");return;});
a.規則
A->B
A 部分是傳入方法的參數
B 部分是函數體
參數類型以及返回類型如果可以通過上下文推斷出來可不寫
當參數只有一個而且它的類型可以被推導得知時,該參數列表外面的括號可以被省略
當函數體只有一個語句且返回類型可被推導時{}可省略
b.例子
Runnable runnable = ()->System.out.println(sign);
Runnable runnable2 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub}
};
通過匿名內部類我們知道run方法是不需要參數的
System.out.println(sign) 相當於run方法的方法體
Comparator<Integer> lol = (x,y)->x-y;
Comparator<Integer> lol = (x,y)->{System.out.println(x+y);return x-y;};
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return 0;
}
};
通過匿名內部類我們知道compare方法需要兩個參數
這時編譯通過Comparator<Integer>中Integer推導出參宿類型及返回類型
c.深入
lamba表達式可被看做函數,java.util.function定義了常用的函數式接口
http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
BiFunction<T,U,R>
T 代表第一個參數
U 代表第二個參數
R 代表返回值
這表時T,U,R都需要編譯器根據上下文進行類型推導
Consumer<T> 代表e->System.out.println("Hello world")
所以當一個方法需要的是lamba表達式時,參數展現形式是java.util.function中定義的樣式
(2)方法引用
方法引用是對Lamba表達式的簡化
類名::方法名(對象方法、類方法)
int[] oop = {3,1,2,1};
static void sayHello(Integer name)
{
System.out.println(123);
}
Arrays.stream(oop).forEach(Test::sayHello);
Arrays.stream(oop).forEach(s->Test.sayHello(s));
構造方法引用:Class::new
數組構造方法引用:TypeName[]::new
(3)強制類型轉換
有時候編譯器通過上下文推導出的返回類型與實際類型不符時需要進類型轉換
Stream<Object> strings = shapelist.stream().<Object>map(s->s.getColor());
s.getColor())
s.getColor()返回的是String
(4)lamba表達式在java對象中的應用
你應該在任何java對象中嘗試應用lamba表達式,通則是將這個對象轉換成java.util.stream,流有串行並行之分哦!並行流關鍵字parallelStream
數組 Arrays.stream()
List、Set .stream()
String String.chars
...
java.util.stream提供了許多方法用來操作流中的數據,去試一試吧
http://docs.oracle.com/javase/8/docs/api/
java 8英文API,沒有找到中文的...
(2)對流整體的操作
比如我們可以求一個流的的總和
int sum = Arrays.stream(oop).sum();
int sum1 = Arrays.stream(oop).reduce(0,(x,y)->x+y);
(3)集合之間的轉換
我們可以將ArrayList<Shape> 轉換成ArrayList<String>、Set<String>、HashMap<String,String>,HashMap<String,Shape>甚至是更復雜的
a.map()
該方法是映射的意思(一開始我聯想到了HashMap),還有mapToDouble等
b.collect()
collect()接受Collectors類型的參數,用來將流重新匯合,
Collectors是收集器,Collectors.toList(),Collectors.toMap()、Collectors.groupingBy等
c.例子
public class Shape
{
private String color;
public Shape() {
// TODO Auto-generated constructor stub
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Shape(String color)
{
this.color = color;
}
}
ArrayList<String> colorList = new ArrayList<String>(){
{
add("Red");
add("Blue");
add("Yellow");
}
};
List<Shape> shapeList = colorList.stream().map(Shape::new).collect(Collectors.toList());
List<String> colos = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toList());
Set<String> colosSet = shpaeList.stream().map(s->s.getColor()).collect(Collectors.toSet());
Map<String, String> colorMap = colorList.stream().collect(Collectors.toMap(a->a,s->s));
Map<String,Shape> shapesMap = shpaeList.stream().collect(Collectors.toMap(s->s.getColor(), s->s));
Eclipse點不出getColor()方法,還以為用法不對...
Map<String,Set<Shape>> shapeMapSet = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.toSet()));
Map<String,Map<String, List<Shape>>> shapeMap3 = shpaeList.stream().collect(Collectors.groupingBy(s->s.getColor(),Collectors.groupingBy(s->s.getColor(),Collectors.toList())));
(4)集合本身的操縱
想要改變現有集合而不產生新的集合可以使用
Iterable.forEach(Consumer),Collection.removeAll(Predicate),List.replaceAll(UnaryOperator),List.sort(Comparator)和Map.computeIfAbsent()等
shpaeList.sort(Comparator.comparing(Shape::getColor));
(5)好文推薦
我讀了兩遍
http://www.cnblogs.com/figure9/archive/2014/10/24/4048421.html
http://www.cnblogs.com/GYoungBean/p/4301557.html
第三篇沒有找到,那位小伙伴提供下!