java 特性拾遗

静态导入

一个类中的静态方法和静态变量可以直接导入使用,而不必导入整个类。使用 import static

package com.yawn.java8;

import static com.yawn.java8.util.TestUtil.DEFAULT_NAME;
import static com.yawn.java8.util.TestUtil.getDefaultName;

/**
 * @author yawn
 * @date 2018-04-10 15:14
 */
public class Test {

    public static void main(String[] args) {
        // 静态导入后直接使用
        String defaultName = getDefaultName();
        String name = DEFAULT_NAME;
    }
}

接口默认方法和静态方法:

在接口中,可以使用default定义普通方法,也可以使用static定义静态方法;普通方法通过实现类的实例进行调用,静态方法通过接口名进行调用。

package com.yawn.java8;

/**
 * @author yawn
 * @date 2018-04-10 15:14
 */
public class Test {

    public static void main(String[] args) {
        IMessage message = new IMessage() {
            // 普通方法甚至在实现类中可以重写
            @Override
            public void hello2() {
                System.out.println("hello2 override");
            }
            @Override
            public void message(String message) {
                System.out.println(message);
            }
        };

        message.message("这是一个msg消息!");
        // 接口中的 default 方法
        message.hello1();
        message.hello2();
        // 接口中的 static 方法
        IMessage.world1();
        IMessage.world2();
    }
}
interface IMessage {
    // 普通方法通过对象调用
    default void hello1() {
        System.out.println("Hello1");
    }
    default void hello2() {
        System.out.println("Hello2");
    }
    // 静态方法通过类名调用
    static void world1() {
        System.out.println("World1");
    }
    static void world2() {
        System.out.println("World2");
    }

    void message(String message);
}

这样使用,使得接口更像抽象类,同时也可以让子类实现多个接口。

方法引用

XWPFTemplate template = XWPFTemplate.compile("contract_generate.docx");
template.getElementTemplates().stream()
        .map(ElementTemplate::getTagName)
        .collect(Collectors.toList())
        .forEach(System.out::println);
template.getElementTemplates().stream()
        .map(element -> element.getTagName())
        .collect(Collectors.toList())
        .forEach(tagName -> System.out.println(tagName));

当lambda表达式只是调用了一个已经申明过的方法时,为了增加可读性和进一步简化,可以使用方法引用。

4类方法引用:

类型

例子

static方法的引用

ContainingClass::staticMethodName

特定对象的方法的引用

containingObject::instanceMethodName

特定类型的方法的引用

ContainingType::methodName

构造器的引用

ClassName::new

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏水击三千

浅谈JavaScript的面向对象程序设计(四)

  本文继续讲解JavaScript的面向对象程序设计。继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承。接口继承只继承...

2789
来自专栏前端学习心得

ES6数组的扩展----Array.from()和Array.of()

如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object),即为伪...

863
来自专栏C/C++基础

正则表达式简介

正则表达式(Regular Expression),又称规则表达式,在代码中常简写作regex、regexp或RE。正则表达式通常用来检索、替换那些符合某个模式...

994
来自专栏Python小屋

Python扩展库numpy中的布尔运算

首先解答上一篇文章Win10系统配置Python3.6+OpenGL环境详细步骤中的问题。该问题的答案为[2, 2],要点在于列表对象的方法index()默认是...

3259
来自专栏向治洪

ECMAScript 6之变量的解构赋值

1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 以前,为变量赋值,只能...

2067
来自专栏数据处理

Scala函数

2025
来自专栏进击的君君的前端之路

this_原型链_继承

1142
来自专栏Bug生活2048

Python自学之路-数据类型和变量

在Python中的整数和浮点数是没有大小限制的,而某些语言是根据其存储长度是有大小限制的,也就是说你可以随便乘除,不用担心溢出的情况,这点Python还是挺友善...

991
来自专栏编程之旅

ES6——箭头函数

ES6之后,允许使用箭头=>来定义函数。首先我们来总结一下箭头函数存在的意义,之后再来细细的看它的使用方法。

732
来自专栏向治洪

Koltin数据类之解构申明

所谓的解构声明就是将一个对象解构(destructure)为多个变量,也就是意味着一个解构声明会一次性创建多个变量.简单的来说,一个解构声明有两个动作: 声明了...

23210

扫码关注云+社区