Java8 Lamdba表达式 001

在一个已经存在的编程语言里非常少有对现有的生态系统起重大影响的新特性。Lambda表达式对于Java语言就是这样的意义的存在。简单来说,Lambda表达式提供了便利的方式去创建一个匿名的功能。提供了一个简单的方式使用表达式或一系列的状态创建一个简单方法。Lambda表达式是包括一个抽象方法的接口。Lamdba表达式能够用来创建简单的匿名功能来实现对集合元素的排序和过滤,还能分配变量并传递到其它对象中。等等。以下将结合样例来加深大家对Lamdba的理解。

首先讲一下安装配置 要想使用Lamdba,须要安装jdk1.8 你能够到官网下载 至于环境变量配置  參考本人其它的博客 or baidu|google.

(鉴于本人是小菜鸟所以使用IDE而非记事本),Eclipse 版本号 为 kepler 能够搜索eclipse kepler 下载

以上两步都完毕 启动Eclipse  安装eclipse支持编译java8的插件

安装完成重新启动后 開始lamdba之旅 ^_^

先来一个简单的样例

新建项目  java8 包名 java.lamdba

废话少说 上代码

001

public class HelloLambda {

	public interface HelloType{
		void hello(String text);
	}

	public static void main(String[] args) {
		HelloType helloLambda = (String text) -> {System.out.println("Hello " + text);};
		helloLambda.hello("Lambda");
	}

}

一个lamdba表达式是一个匿名的代码块封装了一个表达式或一系列状态并返回一个值。lamdba表达式也类似于其它语言中的闭包的概念。它接受零或多个參数[下面类似皆用num[+...]形式表示]。每一个參数能够显式指定类型也能够不显式指定类型[假设不指定类型java会自己主动从上下文中判断类型]。

如上所看到的,一个lamdba表达式包括了一个參数列表,一个java原来没有的字符 ‘->’ 以及一个以大括号包围起来的方法体。

(argument list) -> { body }

对一个lamdba表达式,參数列表能够包括0+个參数。假设没有參数,那么仅仅使用一对空的括号。假设仅仅有1个參数,能够不必使用括号。每一个參数的类型指定都是可选的。假设没有指定类型,则从上下文中判断。body里假设有1+行,用大括号包围起来。

执行上面的程序。会看到期望的输出 。

001 定义了一个接口 接口声明了一个方法  Main里写了接口的lamdba实现  依据 ( argument list ) -> {body} ; 传递一个參数 声明或不声明类型 ( text ) 方法体里打印"Hello" + text;然后调用hello并传值 结果打印 Hello Lamdba。

上代码 002

public class ActionCodeExample {

	interface ActionCode{
		int returnCode(String codestr);
	}

	public static void main(String[] args) {
		/**
		 * A lambda expression can contain any statement that an ordinary Java
		 * method contains. However, the continue and break keywords are illegal
		 * at the top level.
		 */
		ActionCode code = (codestr) -> {
			switch (codestr) {
			case "ACTIVE": return 0;
			case "INACTIVE": return 1;
			default:
				return -1;
			}
		};
		System.out.println(code.returnCode("ACTIVE"));
	}

}

002 中方法返回了一个int值,该接口方法接收一个字符串 依据switch这个字符串处理结果返回int,本例Lamdba封装了方法体的功能。

写一些自己定义的接口然后用Lamdba表达式来实现。全部的Lamdba表达式都实现了一个功能接口[仅仅有一个抽象方法的接口]。

上代码003

public class ReverseTypeExample {

	interface ReverseType {
		String reverse(String text);
	}

	public static void main(String[] args) {
		ReverseType newText = (testText) -> {
			String tempStr = "";
			for (String part : testText.split(" ")) {
				tempStr = new StringBuilder(part).reverse().toString();
			}
			return tempStr;
		};
		System.out.println(newText.reverse("HELLO"));
	}
}

003中功能接口包括了一个抽象方法的定义String reverse(String text),Main使用lamdba表达式实现了ReverseType,然后打印出返回值 OLLEH 。

除了使用上述方法外,我们还能使用在java.util.function包下的类去实现lamdba表达式,004将用Function<T,R>接口完毕003一样的功能。上代码004:

import java.util.function.Function;

public class FunctionExample {

	public static void main(String[] args) {
		/**
		 * accepts a string argument and returns a string result
		 */
		Function<String, String> newText = (testText) -> {
			String tempStr = "";
			for(String part : testText.split(" ")){
				tempStr = new StringBuilder(part).reverse().toString();
			}
			return tempStr;
		};
		System.out.println(newText.apply("WORLD"));
	}

}

注意到我们导入了包java.util.function.Function;格式为Function<arugent list,return result>,Function为泛型:左边为接收的參数类型,右边为返回类型。并通过 apply()  来调用。004打印出DLROW。

看了这些样例,可能会想到假设每须要一种功能,就要自己写实现。java为我们预提供了非常多功能如图所看到的

使用java.util.function包下的的功能接口能够极大的降低你要编写的代码,并提高代码的性能。

下篇文章我们将使用lamdba表达式讲一下简单的排序,本篇就到这了。

ps:本文演示样例引自 Josh Juneau所著 Java 8 Recipes, 2nd Edition

mission completed!

O(∩_∩)O~

时间: 2024-11-05 16:04:33

Java8 Lamdba表达式 001的相关文章

Java8 Lamdba表达式 003

继续lamdba.上篇Java8 Lamdba表达式 002讲了使用lamdba对集合元素进行排序,本篇讲述使用lamdba对集合元素过滤,演示样例代码沿用上篇: 001 public class SortingPlayer { public static void main(String[] args) { List<Player> playerList = new ArrayList<>(); playerList.add(new Player("Black"

Java8 Lamdba表达式 002

本篇将讲述lamdba表达式的排序,本例包含一个Player对象的集合[稍后定义],通过每个player的分数高低对列表的player进行排序,类定义001如下 public class SortingPlayer { public static void main(String[] args) { List<Player> playerList = new ArrayList<>(); playerList.add(new Player("Black", &q

Java8 Lambda表达式深入学习(4) -- Java8实现方式

前几篇文章讨论了函数式接口和Lambda表达式语法.invokedynamic指令,以及Groovy2如何利用indy指令.本篇文章在前面几篇的基础之上,简要介绍Java8底层是如何实现Lambda表达式的. 示例代码 本文将以下面的代码为例展开讨论: import java.util.Arrays; import java.util.List; public class LambdaImplTest { public static void main(String[] args) { m1(A

java8 lambda表达式初接触

环境是jdk8 代码如下: package memTest; /** * Created by PC on 2014/8/5. */ public class LambdaOne { public static void test(){ new Thread(()-> System.out.print("hi") ).start(); } public static void main(String[] args) { new LambdaOne().test(); } } ja

深入学习Java8 Lambda表达式 -- 从函数式接口说起

希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论.FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那么它就是一个FI.为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解.举个简单的例子,Runnable接口就是一个FI,下面是它的源

c#Lamdba表达式与托付

介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,能够包括表达式和语句,而且可用于创建托付或表达式文件夹树类型. 怎样创建 格式:( 形參列表 ) => { 函数体 } 若要创建 Lambda表达式,须要在 Lambda运算符=>左側指定输入參数(假设有),然后在还有一側输入表达式或语句块.比如,lambda表达式 x => x * x指定名为 x的參数并返回 x的平方

回调与Java8的λ表达式

[9.3.1 回调]中,介绍了回调和<a target=_blank href="http://blog.csdn.net/yqj2065/article/details/8758101">好莱坞原则 (Java中)回调与通常的(遵循OCP 代码的)非回调代码,使用的技术不过是动态绑定/多态. 回调与通常的非回调代码,从类图和其自身代码上,没有区别. 之所以需要回调callback.隐式调用Implicit invocation(某些软件架构的作者使用的术语),是因为分层结

c#Lamdba表达式与委托

介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. 如何创建 格式:( 形参列表 ) => { 函数体 } 若要创建 Lambda表达式,需要在 Lambda运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda表达式 x => x * x指定名为 x的参数并返回 x的平方值.

java8 lambda表达式的一些用法

用 lamdba 表达式操作 对象集合的比较 优雅.代码也比较简洁. 希望大家掌握(可以避免写foreach 循环). 下面是实例代码(入门级,需要高级应用,自己得百度或者研究了) /** * Project Name:test * File Name:myTest.java * Package Name:test * Date:2016年8月15日下午5:39:50 * Copyright (c) 2016, [email protected] All Rights Reserved. * *