Java Lambda表达式(Java Lambda Expression),
分享于 点击 9632 次 点评:228
Java Lambda表达式(Java Lambda Expression),
从匿名内部类说起
在Java中,存在这么一个问题,就是当一个
匿名内部类
的实现非常简单,就像一个Interface
只包含一个方法,此时该内部类
的语法看起来就相当的笨拙且极不简洁,此时我们可能更希望能通过一个函数式的方法来解决这样的问题,传递给他一个参数,然后完成某个动作,在Java8
中Lambda表达式
可以帮我们完成这样的工作。
public class AnonymouseDemo {
//内部接口
interface InnerInterface{
//定义一个say()方法,没有参数
public abstract void say();
}
public static void main(String[] args) {
/**
* 实现匿名内部类 -- new InnerInterface{ }
*/
InnerInterface inter=new InnerInterface() {
@Override
public void say() {
System.out.println("Hello Inner Interface!");
}
};
inter.say();
}
}
- 运行结果 :
Hello Inner Interface!
从结果来看,实现一个输出
Hello Inner Interface
并不是那么简洁,现在,很多语言都支持Lambda表达式
Java8的新特性里面就包含了Lambda表达式。
- Java 中
Lambda表达式
的语法为:( argument )->(body)
即( 参数 )->(body)
(int a,int b)->{return a-b}
//表示输出一句话
(String demo) -> { System.out.println(demo); }
//表示返回666 return 666
() -> 666
() ->{ return 0.618 };
- 有了
Lambda表达式
上面的匿名内部类
可以可以可以这样
public class LambdaDemo {
//内部接口
interface InnerInterface{
//定义一个say()方法,没有参数
public abstract void say();
}
public static void main(String[] args) {
//使用Lambda表达式,没有参数
InnerInterface inner=()->System.out.println("Lambda Expression!");
inner.say();
}
}
- 运行结果 :
Lambda Expression!
相比而言
Lambda Expression
是不是更简单呢? 那么问题来了!?什么样的情况下我们能使用Lambda Expression
表达式呢?,还记得前面提到的函数式的方法吗?
Functional Interfaces
函数式接口
.
A functional interface is any interface that contains only one abstract method. (A functional interface may contain one or more default methods or static methods.)
- Java中函数式接口有很多,例如Runable,Thread,Consumer,Predicate等 ,可以这样使用
Lambda Expression
。
//JDK中Runnable 接口的定义,便是一个函数式接口,用@FunctionalInterface进行标记
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
//Anonymouse Class
Runnable run=new Runnable() {
@Override
public void run() {
System.out.println("Old Way");
}
};
//Lambda Expression
Runnable r = () -> System.out.println("Ha Ha ..Lambda Expression!");
//Anonymouse Class
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Old Way");
}
}).start();
//Lambda Expression ...
new Thread(
() -> System.out.println("Ha Ha ..Lambda Expression!")
).start();
*以上都是不带参数的
Lambda Expression
示例,以下讲解带参数的Lambda Expression
以及泛型函数式接口
示例
/**
* @author junit
* 带参数的 泛形函数式接口
*/
@FunctionalInterface
public interface FunctionalClassParamters<T> {
/**
* @param n
* @return
*/
public abstract T getResults(T n);
}
/**
* @param args
* Lambda Expression Test
* 带参数的Lambda 表达式
*/
public static void main(String[] args){
System.out.println("With Parameters..");
/*
* 指定参数类型为String
*/
FunctionalClassParamters<String> parameters;
/*
*
* 可以指定参数类型,也可以不指定参数类型。
* parameters=(String n)->n;也是合法的。
* 当只有一个参数时,可以不用括号如:
* parameters=n->n 也是合法的。
*
*/
parameters=(n)-> n;
System.out.println(paramters.getResults("String Type"));
/*
* 指定参数类型为Integer
*/
FunctionalClassParamters<Integer> integer_parameters;
integer_parameters=(p)->{
p++;
p*=100;
return p;
};
System.out.println(integer_parameters.getResults(50));
}
- 运行结果:
With Parameters..
String Type
5100
相关文章
- 暂无相关文章
用户点评