java8三种函数式接口的说明

直接贴代码,注释非常清楚
Predicated

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @Author khe
 * @Date 2018/12/5
 */

/****
 * 说明 :Predicated定义了一个接口,要求传入一个泛型为T的参数,然后对参数进行test方法判断
 * 返回一个boolean
 *
 */

public class PredicatedTest {

	/***
	 * 定义一个方法,实现:传入一个list,通过断言过滤后返回你需要的list
	 * 这就非常方便了,你想要什么过滤条件就通过lambda表达式传递进来
	 * @param list
	 * @param predicate
	 * @return
	 */
	public static List<Integer> getListByFilter(List<Integer> list, Predicate<Integer> predicate) {
		List<Integer> result = new ArrayList<>();
		for (Integer i : list) {
			if (predicate.test(i)) {
				result.add(i);
			}
		}
		return result;
	}

	public static void main(String[] args) {
		//数字大于5的集合
		List<Integer> originList = Arrays.asList(1, 23, 45, 45, -56, 67, -4, 534, 4, 6);
		List<Integer> list1 = getListByFilter(originList, (Integer i) -> i > 5);
		System.out.print("大于5的数 :");
		for (int i : list1) {
			System.out.print(i + " ");
		}
		System.out.println();

		//偶数集合
		List<Integer> list2 = getListByFilter(originList, (Integer i) -> i % 2 == 0);
		System.out.print("偶数 :");
		for (int i : list2) {
			System.out.print(i + " ");
		}
		System.out.println();

		//负数集合
		List<Integer> list3 = getListByFilter(originList, (Integer i) -> i < 0);
		System.out.print("负数 :");
		for (int i : list3) {
			System.out.print(i + " ");
		}
		System.out.println();

		//素数集合
		List<Integer> list4 = getListByFilter(originList, (Integer i) -> {
			//有点小长的代码可以通过{}括起来
			//2特殊处理,2是最小的素数,凡是2的倍数都不是素数,还有负数的考虑
			if (i == 2) {
				return true;
			}
			if (i < 2 || i % 2 == 0) {
				return false;
			}
			//这里有个点需要提一个,为什么需要把平方根单独算出来,
			//理由是这会减少代码的执行次数,因为大部分人都会选择将计算平方根
			//的计算直接写在for循环上,这样每次执行都会重新计算平方根,
			// 代码执行效率可想而知,因此需要单独拿出来
			int end = (int) Math.sqrt(i);
			//2的倍数已经排除掉了
			for (int temp = 3; temp <= end; temp += 2) {
				if (i % temp == 0) {
					return false;
				}
			}
			return true;
		});
		System.out.print("素数 :");
		for (int i : list4) {
			System.out.print(i + " ");
		}
		System.out.println();

	}

}

Consumer

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

/**
 * @Author khe
 * @Date 2018/12/5
 */

/***
 * 说明:Consumer定义了一个accecp方法,要求传入一个泛型为T的参数,返回值为void
 * 然后由调用者对传入的参数进行一系列的操作
 */
public class ConsumerTest {

	/***
	 * 说明:这是一个修改值的方法,通过consumer对需要修改的值进行accept操作存起来
	 * 然后具体实现由调用者提供
	 * @param list
	 * @param consumer
	 */
	private static void consumerList(List<Integer> list,Consumer<List<Integer>> consumer){
		//将集合加入处理
		consumer.accept(list);
	}

	public static void main(String[] args) {
		List<Integer> originList = Arrays.asList(1, 23, 45, 45, -56, 67, -4, 534, 4, 6);
		//将大于5的数打印
		consumerList(originList,(List<Integer> list)-> {
			for(int i=0;i<list.size();i++)
			if(list.get(i)>5)
			System.out.print(list.get(i)+ " ");
		});
		System.out.println();
		//将所有数修改为0
		consumerList(originList,(List<Integer> list)->{
			for(int i=0;i<list.size();i++) list.set(i,0);
		});
		//值已经修改
		for (int i : originList) {
			System.out.print(i+" ");
		}
	}

}

Function

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

/**
 * @Author khe
 * @Date 2018/12/5
 */

/***
 * 说明Function接口提供了apply方法,实现一个传入泛型为T的对象返回一个泛型为R的对象
 */
public class FunctionTest {
	/***
	 * 这里使用官方的例子,实现的功能是传入个T泛型的List,返回一个R泛型的List
	 * @param list
	 * @param function
	 * @param <T>
	 * @param <R>
	 * @return
	 */
	public static <T, R> List<R> map(List<T> list, Function<T, R> function) {
		List<R> result = new ArrayList<>();
		for (T t : list) {
			result.add(function.apply(t));
		}
		return result;
	}

	public static void main(String[] args) {
		//将String类型的list转换为字符串长度的List
		List<String> stringList = Arrays.asList("lambda", "in", "action");
		List<Integer> list = map(stringList, (String s) -> s.length());
		for (int i : list) {
			System.out.println(i);
		}
	}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值