简介
java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式、函数式接口、方法引用、默认方法、新工具(编译工具)、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的java7,甚至开发人员开发新产品时依然没有选择升级,写关于java8系列文章的目的在于梳理和分享java8新增的主要特性,开发时也可以用作参考 lambda表达式是java8新增的主要特性之一,lambda表达式又称闭包或匿名函数,主要优点在于简化代码、增强代码可读性、并行操作集合等。至于是否使用,有的同学觉得不适应,有的同学欲罢不能,见仁见智~
,
,
,
,
函数式接口
特点:之后一个抽象方法的接口可以被叫做函数式接口 如:Runnable 接口 里面就一个Run 方法
特性:
1、无参数,返回值1() -> 1
2、无参数,无返回值() -> System.out.print("Java8 lambda.");//3、1个参数,参数类型为数字,返回值为其值的5倍x -> 5 * x
4、2个参数,参数类型均为数字,返回值为其差值(x, y) -> x - y
5、2个参数,指定参数类型均为int型,返回值为其差值 (int x, int y) -> x - y
6、1个参数,指定参数类型为String ,无返回值(String str) -> System.out.print(str)
提示:如果加了大括号返回值必须要加上 return 没加大括号就直接书写对应的参数即可,但是只能有一行代码 如果是多行代码必须要加上大括号
代码
public class LambdaExpressionDemo {
public static void main(String[] args) {
//启动线程 实现了一种函数式接口
new Thread(()->{
for(int index=1;index<=10;index++){
System.out.println(index);
}
}).start();
//设置自定义函数式接口
MyLambda lambda = (value ) -> {
System.out.println("内部那个");
return value;
};
String value= ExpressionDemo.prite((String value2)->value2);
System.out.println(value);
}
static class ExpressionDemo{
public static String prite(MyLambda lambda){
return lambda.test1("刘梓江");
}
}
}
//函数式接口
interface MyLambda{
public String test1(String value);
}
,
,
,
使用 foreach 方式遍历集合
特点:替代了for(xx:xx)的方式
List<String> list=new ArrayList<>();
list.add("123");
list.add("123");
list.add("123");
list.add("123");
list.add("123");
list.forEach((n)->{
System.out.println(n);
});
提示: lambda表达式可以使用方法引用,当且仅当主体中不修改lambda表达式提供的参数 不过不建议使用方法引用因为可读性差
如:
features.forEach(n -> System.out.println(n));
等价于
features.forEach(System.out::println);
,
,
,
,
,
,
,
Stream 流的使用
流的转换
数组转换流
Integer [] array={3,3,5,56,7,8,8,9,923,1};
Arrays.stream(array)
集合转换流
List<String> myList=new ArrayList<>();
myList.add("刘梓江");
myList.add("彭学明");
myList.add("余烨");
myList.stream();
map转换流
Map<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap<>());
objectObjectMap.put("2",2);
objectObjectMap.put("3",3);
objectObjectMap.put("1",1);
objectObjectMap.put("4",4);
objectObjectMap.put("5",51);
objectObjectMap.put("6",61);
objectObjectMap.entrySet().stream();
,
,
,
Stream流下的一些常用方法
filter :参数是一个函数式接口 里面是一个有返回值的方法 返回值类型就是boolan 参数就是集合元素
当拿到集合元素做判断 如果符合判断返回true 流就会将当前元素给保留 不符合就会过滤掉
map : 参数是一个函数式接口 将当前中各个元素进行物理上的修改
sorted: 对当前流下的内容进行显示排序
collect: 将当前内容转换成集合
//List集合操作
List<String> myList=new ArrayList<>();
myList.add("刘梓江");
myList.add("彭学明");
myList.add("余烨");
List<String> collect = myList.stream()
.filter(e->{return !e.equals("刘梓江");})
.map(n -> {
return n + "123";
}).collect(Collectors.toList());
System.out.println(collect.toString());
结果
,
,
,
,
//map的操作
Map<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap<>());
objectObjectMap.put("2",2);
objectObjectMap.put("3",3);
objectObjectMap.put("1",1);
objectObjectMap.put("4",4);
objectObjectMap.put("5",51);
objectObjectMap.put("6",61);
Map<Object, Object> newMap = objectObjectMap.entrySet()
.stream()
//过滤map中的元素信息 返回布尔值
.filter(e -> {
return (int) e.getValue() < 5;
})
//对map中的内容修改 返回当前修改后的map对象
.map(e -> {
if (e.getKey().equals("4")) {
e.setValue(99);
System.out.println("修改成功");
}
return e;
})
//对map降序排序 注意排序直对当前map显示效果有效
.sorted(new Comparator<Map.Entry<Object, Object>>() {
@Override
public int compare(Map.Entry<Object, Object> o1, Map.Entry<Object, Object> o2) {
return (int) o2.getValue() - (int) o1.getValue();
}
})
//转map集合 注意当前map的显示效果与转换的内容位置没有联系
.collect(
Collectors.toMap(
e -> {return e.getKey();}, //设置什么是主键
e2 -> {return e2.getValue();} //设置什么是值
)
);
//将转换成功的map二次遍历
Set<Map.Entry<Object, Object>> entries = newMap.entrySet();
entries.forEach(e->{
System.out.println(e.getKey()+"=="+e.getValue());
});
结果