java lambda表达式 遍历操作集合

经常需要遍历集合中的元素,做一些操作

假设有这样一个需求: 分别输出字符集合里对应字符,

public void print(List<Character> list){
		for(Character c : list){
			System.out.println(c);
		}
	}

需求变了: 输出字符集合里对应字符的的大写
<pre name="code" class="java">public void printUpper(List<Character> list){
		for(Character c : list){
			System.out.println((char)(c - 32));
		}
	}


 还可能有很多其他操作,遍历是不变的,变化的是操作部分。可以把这些不变的部分写成模板,通过提供回调接口来分离变化的操作,比如: 
public interface Action<T> {
	public void action(T t);
}
那么上面的需求的实现可以写成:

	public void genericPrint(List<Character> list, Action<Character> action){
		for(Character c : list){
			action.action(c);
		}
	}

在具体调用的时候,只需要提供具体的实现就可以。比如输出大写的那个的需求 : 

genericPrint(list, new Action<Character>() {
			@Override
			public void action(Character c) {
				System.out.println((char)(c - 32));
			}
		});

jdk8 提供了对lambda表达式的支持,lambda表达式使得抽象函数行为有了更加方便的方法。

上面的例子在jdk8 中,可以简化为:

genericPrint(list, c -> System.out.println((char)(c - 32)));

这样更加符合逻辑,因为我们需要抽象的只是不同的函数行为。 在上面的例子中 c 为action方法的入参, system......为方法体,编译器做了类型推断,如果写全了应该为:

genericPrint(list, (Character c) -> {System.out.println((char)(c - 32));}); 

并且在jdk8的List中新增了forEach方法(由接口Iterable提供),所以在遍历list操作的时候,可以直接:

list.forEach(c ->System.out.println((char)(c - 32)));

抽象函数行为在很多地方都有见到,比如创建线程,区别就在线程的行为,即run()方法上。现在创建线程可以:

new Thread(() -> {doSomething;});


by the way : lambda表达式不是java语言独创(也不是c#),在函数式语言中lambda表达式是司空见惯的,并且使用的更加优雅与自然, 比如高阶函数。

以erlang为例:对于上面输出大写字符的需求:

lists:foreach(fun(C) ->io:format("~c",[C-32]) end, List).











评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值