Java 8 新特性1-函数式接口
(原)
Java 8 新特性1-函数式接口
Lambda表达式基本结构:
(param1,param2,param3) -> {代码块}
Lambda表达式结构:
(type1 arg1,type2 arg2) -> {body}; //type1、type2表示参数类型,arg1、arg2表示参数,body表示方法体。
(arg1,arg2) -> (body;); //这种写法,编译器会自动判断出arg1,arg2的参数类型,也是正确的;
arg1 -> {body;}; //如果只有一个参数,参数的括号也可以省去。
arg1 -> {return arg1;}; //如果有返回值,可以这么写。
arg1 -> arg1; //输出值只有一句,方法体的大括号可以省掉。
例1:
package com.demo.jdk8; import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer; public class Test2 {
public static void main(String[] args) {
for_test();
for_newMethod();
for_lambda();
} public static void for_test(){
List<Integer> list = Arrays.asList(1,2,3,4,5,6); for(Integer i : list){
System.out.println(i);
}
} public static void for_newMethod(){
List<Integer> list = Arrays.asList(1,2,3,4,5,6); list.forEach(new Consumer<Integer>() { @Override
public void accept(Integer t) {
System.out.println(t);
} });
} public static void for_lambda(){
List<Integer> list = Arrays.asList(1,2,3,4,5,6);
list.forEach(i -> System.out.println(i));
}
}
这三个方法最后执行后的结果都一样
在for_newMethod方法中,可以看到list新增了一个新方法,forEach,可以迭代里面的元素,它的参数是一个consumer接口。

Consumer接口在java.util.function包下,该包是java8新引入的工具包,该接口上有一个@FunctionalInterface注解。
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/ package java.lang; import java.lang.annotation.*; /**
* An informative annotation type used to indicate that an interface
* type declaration is intended to be a <i>functional interface</i> as
* defined by the Java Language Specification.
*这是一个通知性的注解类型,用于去表示某一个接口声明,它指在规定一个函数式接口,
*这个接口由JAVA语言规范去定义的。(也就是说如果一个接口被加上@FunctionalInterface,
*则表示这个接口是一个函数式接口)
* Conceptually, a functional interface has exactly one abstract
* method. Since {@linkplain java.lang.reflect.Method#isDefault()
* default methods} have an implementation, they are not abstract. If
* an interface declares an abstract method overriding one of the
* public methods of {@code java.lang.Object}, that also does
* <em>not</em> count toward the interface's abstract method count
* since any implementation of the interface will have an
* implementation from {@code java.lang.Object} or elsewhere.
*从概念上来说,一个函数式接口只有一个抽象方法,由于java.lang.reflect.Method的方法sDefault()有一个实现,它们不是抽象的。如果一个接口声明了一个接口的方法,重写了java.lang.Object类里面的一个public方法,那么它也没有计入接口的抽象方法加1,
*因为接口的任意一个实现都会有一个来自于java.lang.Object类或其它地方的一个实现。
* <p>Note that instances of functional interfaces can be created with
* lambda expressions, method references, or constructor references.
*注意,含数式接口的实例可以通过lambda表达式、方法引用、或者构造方法引用来创建。
* <p>If a type is annotated with this annotation type, compilers are
* required to generate an error message unless:
*如果一个注解类型带上了这个@FunctionalInterface,编译器会生成一个错误消息,除非以下几种情况:
* <ul>
* <li> The type is an interface type and not an annotation type, enum, or class.
* <li> The annotated type satisfies the requirements of a functional interface.
* </ul>
*这个类型是一个接口类型,并且不是注解、枚举或class类型
*被注解的类型满足了函数式接口的要求
* <p>However, the compiler will treat any interface meeting the
* definition of a functional interface as a functional interface
* regardless of whether or not a {@code FunctionalInterface}
* annotation is present on the interface declaration.
*然而,编译器将会对待满足函数式接口定义的任义的接口,都会把它当成是一个函数式接口而不管是否在它的声明上增加了@FunctionalInterface注解类型。
* @jls 4.3.2. The Class Object
* @jls 9.8 Functional Interfaces
* @jls 9.4.3 Interface Method Body
* @since 1.8
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
把@FunctionalInterface(函数式接口)的文档翻译了一下,还是感觉很绕,再此总结一下,
什么是函数式接口:
1、接口被加上了@FunctionalInterface,表示它是一个函数式接口。
2、如果一个接口只有一个抽象方法,那么表示它是一个函数式接口。
3、如果一个接口有一个抽象方法和一些重写了java.lang.Object类公共方法的方法,那么表示它是一个函数式接口。
例子请看这里:https://github.com/LeeScofield/java8
Java 8 新特性1-函数式接口的更多相关文章
- Java 8新特性-1 函数式接口
Java 8 引入的一个核心概念是函数式接口(Functional Interfaces). 通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行. 如果一个接口定义个唯一一个抽象方法,那么这 ...
- 乐字节-Java8新特性之函数式接口
上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...
- Java(44)JDK新特性之函数式接口
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201667.html 博客主页:https://www.cnblogs.com/testero ...
- Java8新特性之函数式接口
<Java 8 实战>学习笔记系列 定义 函数式接口只定义一个抽象方法,可以有多个默认方法 函数式接口的接口名上,会被@FunctionalInterface标注 作用 函数式接口的方法可 ...
- JDK8新特性:函数式接口@FunctionalInterface的使用说明
我们常用的一些接口Callable.Runnable.Comparator等在JDK8中都添加了@FunctionalInterface注解. 通过JDK8源码javadoc,可以知道这个注解有以下特 ...
- jdk1.8新特性之函数式接口
函数式接口就是只有一个抽象方法的接口.如果这个接口里没有或者包含了两个以上的抽象方法,对不起,你不叫函数式接口,只能叫你接口.那这个函数式有啥用呢?如果配合Lambda表达式的话,可以大大的简化代码. ...
- JDK8新特性:函数式接口
一,定义 函数式接口,英文为Functional Interface.首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法. 这里的只允许一个抽象方法不包括以下几 ...
- JDK8新特性之函数式接口
什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 = new Thread(new Runnable() { @Override public void run() { Syst ...
- Java 8 新特性:1-函数式接口
(原) Java 8 新特性1-函数式接口 Lambda表达式基本结构: (param1,param2,param3) -> {代码块} Lambda表达式结构: (type1 arg1,typ ...
随机推荐
- 在 redhat 6.4上安装Python 2.7.5
在工作环境中使用的是python 2.7.*,但是CentOS 6.4中默认使用的python版本是2.6.6,故需要升级版本. 安装步骤如下: 1,先安装GCC,用如下命令yum install g ...
- AM335X开发板学习系列——环境搭建(vbox虚拟机ubuntu14.04下minicom的安装和配置)
这个系列是我学习AM335X的总结. 1. ubuntu虚拟机的USB设备,选择启用usbserial 2. ubuntu虚拟机的网络,采用桥接模式,以保证开发板和ubuntu虚拟机能互相ping通 ...
- JQuery处理DOM元素-属性操作
JQuery处理DOM元素-属性操作 //操作元素的属性: $('*').each(function(n){ this.id = this.tagName + n; }) //获取属性值: $('') ...
- js解决苹果移动端300ms延迟的问题
做移动端页面开发的可能会了解到,ios系统click事件会有卡顿的现象,这个问题的根源是苹果本身自带的safari有双击放大页面的功能,再次双击会返回到原始尺寸,所以在第一次点击的系统会延迟300ms ...
- CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie
题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...
- APP反编译第一课《如何找到核心代码》
相信很多人都应该会去接触APP反编译,本小七给大家带来入门级别套路,自己也在慢慢摸索学习,一起成长吧.第一步,反编译需要的工具有:一.java环境,其实这里你只要安装了burp就不用管这个的二.apk ...
- Angular vs React 最全面深入对比
如今,Angular和React这两个JavaScript框架可谓红的发紫,同时针对这两个框架的选择变成了当下最容易被问及或者被架构设计者考虑的问题,本文或许无法告诉你哪个框架更优秀,但尽量从更多的角 ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
- Bash 的若干基本问题
Bash 的若干基本问题 这里介绍一些bash启动前.后的问题,以及一些使用bash需要注意的基本问题. 1.Bash的介绍 Bash是一种Shell程序,它是一般的Linux系统中的 ...
- Modelsim使用笔记(一个完成工程的仿真)
这学期在玩Altera的板子,不不, 现在应该叫intel PSG.在QuartusII13.0上老喜欢用modelsim_ae做仿真,小工程用起来也方便,但是我做IIC配置摄像头的时序仿真时,就显得 ...