• default拓展方法

java8为接口声明添加非抽象方法的实现,也成为拓展方法。

public interface Formula {
void doSomething(); default void before() {
System.out.println("我是拓展方法");
}
} public class FormulaService implements Formula { @Override
public void doSomething() {
before();
System.out.println("我是override方法");
}
}
  • Lambda表达式

java8引入函数式编程,Lambda则是函数式编程的基础。

List<String> list = Arrays.asList("a", "b", "c");

// java8之前
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}); // lambda
Collections.sort(list, (String o1, String o2) -> {
return o2.compareTo(o1);
}); // 简洁lambda
Collections.sort(list, (String o1, String o2) -> o2.compareTo(o1)); // 更简洁lambda
Collections.sort(list, (o1, o2) -> o2.compareTo(o1));
  • 函数式接口

一个函数式接口有且只能有一个抽象方法申明,其中该注意的是 @FunctionalInterface 注解,此时如果在接口中定义了第二个抽象方法,编译器将会抛出异常。当然如果不加该注解也不是不行,如果接口中有多个抽象方法,而你又使用了lambda表达式,则在调用处会抛出异常。

@FunctionalInterface
public interface Formula<F,T>{
T convert(F var1);
} Formula<String,Integer> function = (var1 -> Integer.valueOf(var1));
Integer var2 = function.convert("1000");
  • 方法和构造函数引用

方法引用的标准语法是 类名:方法名

类型 示例
引用静态方法 targetClass :: staticMethodName
引用某个对象的实例方法 targetClass :: instanceMethodName
引用某个类型的任意对象的实例方法 targetType :: methodName
引用构造方法 className :: new

引用静态方法

Formula<String,Integer> function = (Integer::valueOf);
Integer var2 = function.convert("1000");

引用某个类型的任意对象的实例方法

public static void main(String[] args) {
String[] array = {"贱明", "学友"};
Arrays.sort(array, String::compareTo);
}

引用构造方法

// 定义工厂
interface PersonFactory<P extends Person>{
P create(String name);
}
// Person类的构造方法
public Person(String name) {
this.name = name;
}
// 创建
PersonFactory<Person> factory = Person::new;
factory.create("贱明");
  • Lambda的范围

lambda可以访问局部对应的外部区域的局部final变量,以及成员变量和静态变量。

访问成员变量

public void doSomething(){
final String p1 = "贱明";
final String p2 = "学友";
Formula function = (person1, person2) -> p1.compareTo(p2);
}

与java8以下版本不同的是,p1 p2你可以不修饰成final 也不会报错,但是如果你想修改他们,编译器则会告诉你这是不被允许的。

访问成员变量和静态变量

public void doSomething(){;
Formula function = (person1, person2) ->{
dehua = "贱明";
xueyou="学友";
return dehua.compareTo(xueyou);
};
}
  • 内置函数式接口

java8 api中提供了很多内置函数式接口,而且有些接口其实在Google Guava中已经实现了,很大程度的降低了程序员的工作负担。

Predicates

Predicate是一个布尔类型的函数,该函数只有一个输入参数,他包含了多种默认实现。

public static void main(String[] args) {
Predicate<String> predicate = (s) -> s.contains("贱明");
String var1 = "牛贱明"; predicate.test(var1); // true
predicate.negate().test(var1); // false Predicate<Boolean> nonNull = Objects::nonNull;
Predicate<Boolean> isNull = Objects::isNull; Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate(); isNotEmpty.and(isEmpty).test(var1);
}

Functions

Function接口接收一个参数,并返回单一的结果。默认方法可以将多个函数串在一起

public static void main(String[] args) {
Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf); System.out.println(toInteger.apply("123"));
System.out.println(backToString.apply("123"));
}

Suppliers

Supplier接口产生一个给定类型的结果。与Function不同的是,Supplier没有输入参数。

Supplier<Person> personSupplier = Person::new;
Person p = personSupplier.get(); // new Person

Consumers

Consumer代表了在一个输入参数上需要进行的操作。

Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.getName());
greeter.accept(new Person("贱明"));

Comparators

Comparator接口在早期的Java版本中非常著名。Java 8 为这个接口添加了不同的默认方法。

Comparator<Person> comparator = (p1, p2) -> p1.getName().compareTo(p2.getName());

Person p1 = new Person("贱明");
Person p2 = new Person("学友"); System.out.println(comparator.compare(p1, p2)); // > 1105
System.out.println(comparator.reversed().compare(p1, p2)); // < -1105

Optionals

Optional不是一个函数式接口,而是一个精巧的工具接口,用来防止NullPointerException产生。

Optional是一个简单的值容器,这个值可以是null,也可以是non-null。考虑到一个方法可能会返回一个non-null的值,也可能返回一个空值。为了不直接返回null,我们在Java 8中就返回一个Optional。

Optional<String> optional = Optional.of("贱明");

System.out.println(optional.isPresent()); // true
System.out.println(optional.get()); // 贱明
System.out.println(optional.orElse("学友")); // 贱明 optional.ifPresent((s) -> System.out.println(s.charAt(0)));

JAVA8新特性(一)的更多相关文章

  1. java8新特性全面解析

    在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...

  2. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  3. Java系列 - 用Java8新特性进行Java开发太爽了

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...

  4. Java8 新特性之Stream----java.util.stream

    这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  7. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  8. Java8 新特性 | 如何风骚走位防止空指针异常

    文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...

  9. 干货 | Java8 新特性教程

    本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...

  10. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

随机推荐

  1. SpringMVC 集成redis

    一.下载导入jar 二.配置redis 1.创建redis.properties # Redis settings #redis.host=192.168.20.101 #redis.port= #r ...

  2. myeclipse+tomcat中出现org.apache.juli.logging.LogFactory这样的错误[转]

      将项目部署好后,启动tomcat后报错,java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 报这个错说明你用的是t ...

  3. 数据处理不等式:Data Processing Inequality

    我是在差分隐私下看到的,新解决方案的可用性肯定小于原有解决方案的可用性,也就是说信息的后续处理只会降低所拥有的信息量. 那么如果这么说的话为什么还要做特征工程呢,这是因为该不等式有一个巨大的前提就是数 ...

  4. mysql服务处理流程

    先把错误日志定位 就是找的错误日志 然后必要的时候 重新启动服务器 排除其他的干扰 把错误日志 挪到旧文件 清空错误日志 然后试着启动 看干净的错误日志 然后 问题就解决了

  5. Paint the Grid Reloaded(缩点,DFS+BFS)

    Leo has a grid with N rows and M columns. All cells are painted with either black or white initially ...

  6. HDU 4325 Flowers(树状数组)

    Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. Node闲谈之Buffer

    在刚接触Nodejs的时候,有些概念总让学前端的我感到困惑(虽然大学的时候也是在搞后端,世界上最好的语言,you know).我可以很快理解File System,Path等带有明显功能的模块,却一下 ...

  8. 状态码为 200 from cache和304 Not modified的区别

    1.请求状态码为 200  from cache: 表示该资源已经被缓存过,并且在有效期内,所以不再向浏览器发出请求,直接使用本地缓存. 如下图: 2.状态码为 304 Not modified: 表 ...

  9. Oracle - java创建Oracle 的触发器

    Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...

  10. java 中 final 的用法

    /* final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承. final可以修饰方法,该方法不能被重写.(覆盖,复写) final可以修饰变量,该变量不能被重新赋值.因为这个 ...