JDK8新特性
原文链接
: 史上最全jdk新特性总结,涵盖jdk8到jdk15!
Lambda表达式
最直接作用就是减少代码,代码直接减少50%+,显得非常简洁
//使用java匿名内部类
Comparator<Integer> cpt = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
TreeSet<Integer> set = new TreeSet<>(cpt);
System.out.println("=========================");
//使用JDK8 lambda表达式
Comparator<Integer> cpt2 = (x,y) -> Integer.compare(x,y);
TreeSet<Integer> set2 = new TreeSet<>(cpt2);
// java7中 筛选产品为nike的
public List<Product> filterProductByColor(List<Product> list){
List<Product> prods = new ArrayList<>();
for (Product product : list){
if ("nike".equals(product.getName())){
prods.add(product);
}
}
return prods;
}
// 使用 lambda
public List<Product> filterProductByPrice(List<Product> list){
return list.stream().filter(p->"nike".equals(p.getName())).collect(Collectors.toList());
}
函数式接口
位于java.util.function包下,下面介绍最常用的几个
- Predicate
接收一个值返回boolean
Predicate p = t->true;
- Supplier
无接受参数返回一个值
Supplier<T> s = () -> new T();
- Consumer
接受一个参数无返回值
Consumer<String> c = c -> System.out.println(s);
- Function<T,R>
接受参数T 返回参数R
Function<Long,String> f = c -> String.valueof(c);
- 其他还有一些 BiFunction,BiConsumer,DoubleSupplier等大家有兴趣自己去阅读下源码
方法引用
- 静态引用: 格式:Class::static_method
List<String> list = Arrays.asList("a","b","c");
list.forEach(str -> System.out.print(str));
list.forEach(System.out::print);
- 构造器调用 构造器方法引用格式:Class::new,调用默认构造器
List<String> list = Arrays.asList("a","b","c");
List<Test> list.stream().map(Test::new).collect(Collectors.toList());
public class Test{
private final String desc;
public Test(String desc){
this.desc=desc;
}
}
- 方法调用 格式:instance::method
List<String> list = Arrays.asList("a","b","c");
Test test = new Test();
List<String> list.stream().map(test::toAdd).collect(Collectors.toList());
public class Test{
private final String desc;
public Test(String desc){
this.desc=desc;
}
public String toAdd(String desc){
return desc+"add";
}
}
Stream API
// 使用jdk1.8中的Stream API进行集合的操作
@Test
public void test(){
// 循环过滤元素
proList.stream()
.fliter((p) -> "红色".equals(p.getColor()))
.forEach(System.out::println);
// map处理元素然后再循环遍历
proList.stream()
.map(Product::getName)
.forEach(System.out::println);
// map处理元素转换成一个List
proList.stream()
.map(Product::getName)
.collect(Collectors.toList());
}
接口中的默认方法和静态方法
public interface ProtocolAdaptor {
ProtocolAdaptor INSTANCE = DynamicLoader.findFirst(ProtocolAdaptor.class).orElse(null);
default ProtocolAdaptor proxy() {
return (ProtocolAdaptor) Proxy.newProxyInstance(ProtocolAdaptor.class.getClassLoader(),
new Class[]{ProtocolAdaptor.class},
(proxy, method, args) -> intercept(method, args));
}
}
Optional
用于处理对象空指针异常:
public String getDesc(Test test){
return Optional.ofNullable(test)
.map(Test::getDesc).else("");
}