JDK8的随笔(07)_行云流水般的Lambda表达式

好久没有更新啦,继续继续。

最近这个项目陷入了一个使用语言的怪圈。任何东西都想着原来的写法怎么能翻译到新的JDK 的写法。这其实就走入了歧途哇哇哇。

看下面这个例子,是一个很简单的例子。一般情况下我们都会这么写这样的逻辑。

	public static void main(String ... args) {

		List<String> list = new ArrayList<>();

		list.add("a");
		list.add("b");

		for (String str: list) {

	            // 复杂逻辑处理

		}

	}

在JDK8中是可以利用Aggregate来写的,也就是会变成这样:

	public static void main(String ... args) {

		List<String> list = new ArrayList<>();

		list.add("a");
		list.add("b");

		list.forEach(t -> // 这里写逻辑t.getBytes());

	}

其实,这算是一个强加的写法,原来的for逻辑有啥不好,干嘛非得要弄成上面那样写呢?

好,举一个好的例子吧。

想这么一个场景:

首先,我们的系统很大,有需要使用code取得name的处理,这个处理是一个公共处理,提供的In的interface是一个List<ADto>,其中ADto.java是一个领域模型,而返回的结果是一个List<BDto>,其中BDto.java也是一个领域模型。也就是这个公共处理可以批量接受code,批量返回name。

假设ADto.java :

public class ADto {

	private String code;

	private String status;

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

}

BDto.java:

public class BDto {

	private String name;

	private String validTime;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getValidTime() {
		return validTime;
	}

	public void setValidTime(String validTime) {
		this.validTime = validTime;
	}

}

我们的Service.java:

public class Service {

	public static List<BDto> returnNames(List<ADto> list) {

		// 逻辑省略
		// 采用guava的List生成方式
		return Lists.newArrayList(Arrays.asList(new BDto()));
	}

}

调用类以前怎么写?:

		ADto a = new ADto();
		a.setCode("code");
		a.setStatus("status");
		List<ADto> lista = new ArrayList<>();
		lista.add(a);

		List<BDto> listb = Service.returnNames(lista);

		UserBean bean = new UserBean();
		if (null != listb) {

			// 把得到的name设置到inputme这个字段
			bean.setInputme(listb.get(0).getName());
		} 

而这个场景才是Lambda和Aggregate该发挥用处的时候,采用JDK8 + guava后怎么样呢?

		ADto a = new ADto();
		a.setCode("code");
		a.setStatus("status");

		UserBean bean = new UserBean();
                // 注意 这里的returnNames方法不能返回一个null,否则在.stream的时候直接就nullPointer了
		Service.returnNames(Lists.newArrayList(Arrays.asList(a))).stream()
				.findFirst().ifPresent(t -> bean.setInputme(t.getName()));

从名字可以看出来,findFirst可以获得第一条数据,ifPresent中可以调用的是一个函数式接口,这个ifPresent也是JDK8中的新方法,一般情况下ifPresent其实可以直接理解为判断null,当不是null的时候即执行后面的Lambda表达式,表达式需要做的就是取得第一个的BDto的Name然后设置到bean的inputme当中去即可。这样的运用才是有效的才是有美感的使用。不要套用,要活用。

文章来自 blog.csdn.net/forevervip

つづく??? 

时间: 2024-11-08 20:19:44

JDK8的随笔(07)_行云流水般的Lambda表达式的相关文章

JDK8的随笔(04)_Lambda表达式扩展之Method References

Method References 方法参照 对于Method Reference了解之前先了解Lambda表达式. 参看: JDK8的随笔(01)_Lambda表达式是个神马东东,初尝禁果 JDK8的随笔(02)_Lambda表达式进一步探讨 JDK8的随笔(03)_Lambda表达式的变量使用范围讨论 Method References 的出现场景 Lambda表达式本身是一个延迟加载采用实现函数式接口的方式来简短代码提高可读性(刚开始可能会降低可读性,熟了就觉得效率很高),减少各种缩进括号

JDK8 的 Lambda 表达式原理

JDK8 使用一行 Lambda 表达式可以代替先前用匿名类五六行代码所做的事情,那么它是怎么实现的呢?从所周知,匿名类会在编译的时候生成与宿主类带上 $1, $2 的类文件,如写在 TestLambda 中的匿名类产生成类文件是 TestLambda$1.class, TestLambda$2.class 等. 我试验了一下,如果使用的是 Lambda 表达式并不会生成额外的类文件,那么字节码里是什么样子的?来看下用  javap -c 反编译出下面文件产生的 TestLambda.class

JDK8新特性 Lambda表达式

一.接口的默认方法二.Lambda 表达式三.函数式接口四.方法与构造函数引用五.Lambda 作用域六.访问局部变量七.访问对象字段与静态变量八.访问接口的默认方法九.Date API十.Annotation 注解:支持多重注解 一.接口的默认方法 Java8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: [java] view plain copy public interface Formula { double calcu

JDK8的随笔(01)_Lambda表达式是个神马东东,初尝禁果

Lambda表达式 先写写背景和最基本的东东,泛型加入和各种循环的复杂模式后面再慢慢深入. 需要看JDK8的背景 虽然网上的介绍很多,但是不如自己读一下document后来得正宗. 说一下缘由,突发的这个项目客户貌似是个暴发户,发疯什么都要用最新的,JDK8是否稳定也不管,各种要求最新.Lambda语法全上,各种jdk8最新的东西全往上搞,我靠...WS还有其他的容器是否对8的支持很好也不知道....不过,这也不是坏事,学呗~~~~ 等jdk出到12的时候再回头看看也挺有意思. 本文也是以JDK

JDK8的随笔(05)_Method References的种类继续啰嗦一下

Method References的种类 我觉得国内的盗链以及随意的盗文的确很严重... 有必要以后每次都写一下文章来源:blog.csdn.net/forevervip 这几天本想把Method Reference赶紧收尾然后写下一个Aggregate的说明,因为Aggregate是Lambda和Method Reference的混合载体,但是一直被一个问题困扰解释不明白,连泛型后来都重新看了一遍,最后想起JVM的一些底层理论才解决.后面写到Aggregate的时候再来讨论. Method R

委托、Lambda表达式、事件系列07,使用EventHandler委托

谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用EventHandler实现一个猜拳游戏,每次出拳,出剪刀.石头.布这三者的其中一种. 首先抽象出一个被观察者,其中提供了事件,提供了执行事件的方法. public class FistGame { public string FistName { get; set; } public event

Python学习_列表解析和Lambda表达式

1.根据要求创建列表threes_and_fives(列表值包括1到15中能够被3或者5正常的数) threes_and_fives=[x for x in range(1,16) if x%3==0 or x%5==0] 2.lambda表达式实例(剔除掉列表中的"X") garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX" message

JDK8的随笔(03)_Lambda表达式的变量使用范围讨论

Lambda变量使用以及使用范围 概念普及 捕获变量 capture variables 啥是capture variables 先看一段代码的例子: public class LocalClassExample { static String regularExpression = "[^0-9]"; public static void validatePhoneNumber( String phoneNumber1, String phoneNumber2) { final in

JDK8的新特性——Lambda表达式

JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. 国内的开发环境大家都知道,有各种的老项目,有各种各样的发布风险,让公司以及项目组对新的技术往往望而却步,有公司甚至时至今日还在使用JDK6来进行项目开发,这导致了在很多技术的选择上受到了很大限制,进而不能跟随时代的脚步使得项目甚至公司一步一步走向衰落. 本文简单认识JDK8的重要新特性之一——La