小敘:最近維護項目的時候看到有人寫這種代碼,而且呈現遞增形勢,自己查了一下,發現是java8的新特性。
List<Coordinate> rs1 = service.simplfy(set, new Function<String, Coordinate>() { @Override public Coordinate apply(String s) { String x = s.split(",")[0]; String y = s.split(",")[1]; String z = s.split(",")[2]; return new Coordinate(x, y, z); } });
自己寫了一下demo,並且分析了一下這種寫法的優勢和場景;
1. 可以將很多場景下通用的邏輯抽象出來 , 將業務代碼寫在業務層:
假設我們在做地圖服務的服務端,會接收到不同的客戶端給我們傳來的不同參數,這些參數的格式都不統一
有的傳的多幾何坐標 x1,y1;x2,y2;... 。 有的是 x1 y1;x2 y2;... 等等
通常處理:如果不用java8特性,我們可能會對每一種規范都單獨寫一個方法。而且 還要寫兩個service接口。
List<Coordinate> methodA(List<String> parms){
List<Coordinate> list = Lists.newArrayList<>();
for(String coord : parms){
String[] split = coord.split(";");
for(String c : split){
String x = c.split(",")[0];
String y = c.split(",")[1];
list.add(new Coordinate(x,y));
}
}
return coordinate
}
List<Coordinate> methodB(List<String> parms){
List<Coordinate> list = Lists.newArrayList<>();
for(String coord : parms){
String[] split = coord.split(";");
for(String c : split){
String x = c.split(" ")[0];
String y = c.split(" ")[1];
list.add(new Coordinate(x,y));
}
}
return coordinate
}
使用java8:
只需要寫一個接口:
public <T> List<Coordinate> simplfy(Collection<T> lnglatList , Function<T ,Coordinate> transformer);
public <T> List<Coordinate> simplfy(Collection<T> lnglatList, Function<T, Coordinate> transformer) { List<Coordinate> rs = new ArrayList<>(); for (T lnglat : lnglatList){ Coordinate Coordinate = transformer.apply(lnglat); rs.add(Coordinate); } return rs; }
剩下的就是在各自的業務中調用:
A使用:
List<Coordinate> rs1 = service.simplfy(set, new Function<String, Coordinate>() { @Override public Coordinate apply(String s) { String x = s.split(",")[0]; String y = s.split(",")[1];return new Coordinate(x, y); } });
B使用:
List<Coordinate> rs1 = service.simplfy(set, new Function<String, Coordinate>() { @Override public Coordinate apply(String s) { String x = s.split(" ")[0]; String y = s.split(" ")[1]; return new Coordinate(x, y); } });
優勢:節約冗余的代碼,優化JVM,減少方法區占用內存空間