JDK1.8函数式编程Predicate及Consumer的用法

JDK1.8函数式编程Predicate及Consumer的用法

Function

Function接口的主要方法

R apply(T t) – 将Function对象应用到输入的参数上,然后返回计算结果。
default <V> Function<T,V> – 将两个Function整合,并返回一个能够执行两个Function对象功能的Function对象。
default <V> Function<T,V> andThen(Function<? super R,? extends V> after) 返回一个先执行当前函数对象apply方法再执行after函数对象apply方法的函数对象。
default <V> Function<T,V> compose(Function<? super V,? extends T> before)返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象。
static <T> Function<T,T> identity() 返回一个执行了apply()方法之后只会返回输入参数的函数对象。

Function 例子

/**
	 * 定义方法,参数中含有Function
	 * @param valueToBeOperate
	 * @param function
	 */
	public  void modifyTheValue(int valueToBeOperate,Function<Integer,Integer> function){
		int newValue = function.apply(valueToBeOperate);//根据输入的参数,然后计算出结果
		System.out.println(newValue);
	}
@Test
	public void testFunction(){
		int incr = 20;
		int myNumber = 10;
		modifyTheValue(myNumber,var -> var + incr + 100);//var 相当于myNumber
	}

结果输出:130 即 10+20+100

FunctionalInterface

FunctionalInterface用法

FunctionalInterface关键字是放在接口中的注解,用于标示此接口可用于函数式编程形式 如”() ->{}“ 的写法,形式如下

@FunctionalInterface
public class Flyer{
	String fly(String name);
}
@FunctionalInterface只能用在中只有一个虚方法的接口中,但接口中可以有其他有某认实现的方法或者静态方法

如下所示

@FunctionalInterface
public interface Flyer {
	String fly(String name);
	default int flyMaxHight(){
		return 1000;
	}
	static void flyMaxDistance(){
		System.out.println("最远里程");
	}
}

但是@FunctionalInterface不能放在有一个以上虚方法的接口中,会报编译错误,如下所示


@FunctionalInterface
public interface Flyer {//报编译错误
	String fly(String name);
	void getSpeed();
	
	default int flyMaxHight(){
		return 1000;
	}
	static void flyMaxDistance(){
		System.out.println("最远里程");
	}
}

FunctionalInterface举例

定义

/**
 * 飞行器
 * @author 734621
 *
 */
@FunctionalInterface
public interface Flyer {
	String fly(String name);
	
	default int flyMaxHight(){
		return 1000;
	}
	static void flyMaxDistance(){
		System.out.println("最远里程");
	}
}
测试
public class TestFlyer {
	
	@Test
	public void testPlane(){
		//调用plane方法
		plane((name)->{//函数式编程
			return "我是"+name;
		});
                // 或者
		plane(name-> "我是"+name );
	}
	private void plane(Flyer flyer) {
		System.out.println(flyer.fly("飞机"));
	}
}

Predicate&Consumer

Predicate 

Predicate的官方解释是”Determines if the input Object  matches for some criteria“,意思是判断输入的参数是否匹配某些条件,即先根据输入的参数及匹配条件判断,参数和匹配条件都是从参数中传入。Predicate带有泛型数据。

Consumer

Consumer的官方解释是”A Operation which accepts a single input argument  and returns no result, Unlike most other functional interfaces,Consumer is expected to operate via side-effects “ 意思是Consumer接收一个简单的参数并且不返回结果,不像其他函数式接口,Consumer期望执行带有副作用的操作。这一点与Function的apply不一样,Function的apply有返回值

Predicate&Consumer 例子

Predicate 和Consumer一般一起配合使用,例子如下

例子中定义了 衣服的类和客户的类,衣服有原价,客户买衣服根据客户的等级可以进行折扣,如下所示

package com.sf.simba.function.consumer;
/**
 * 衣服类
 * @author 734621
 *
 */
public class Clothes {
	private Double price;//衣服价格
	private String name;//衣服名称
   
	public Clothes(String name,Double price){
		this.name = name;
		this.price = price;
		System.out.println(name + "\r\n原价:" + price + "元");
	}
	
	public String getName() {
		return name;
	}

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

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}
	
}
package com.sf.simba.function.consumer;
/**
 * 客户类
 * @author 734621
 *
 */
public class Customer {
	private String name;
	private int level;//用户等级VIP
	private Double freaCount = 0.0;//折扣
	private Clothes clothes;
	public Customer(String name,int level,Clothes clothes){
		this.name = name;
		this.level = level;
		this.clothes = clothes;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	public Double getFreaCount() {
		return freaCount;
	}
	public void setFreaCount(Double freaCount) {
		this.freaCount = freaCount;
	}
	public Clothes getClothes() {
		return clothes;
	}
	public void setClothes(Clothes clothes) {
		this.clothes = clothes;
	}
	/**
	 * 计算折扣后的价格
	 * 折扣后的价格=衣服原价 - 客户折扣*衣服原价
	 * 如折扣率为30表示可以折扣30%,即折扣后的价格为:  衣服原价*70%
	 * @return
	 */
	public Double getTruePrice(){
		Double result = 0D;
		result = clothes.getPrice() - ((getFreaCount()*clothes.getPrice())/100);
		System.out.println(getName() + ",根据你的等级,"+clothes.getName()+"打折后的价格是:" + result + "元");
		return result;
	}
}

package com.sf.simba.function.consumer;

import java.util.function.Consumer;
import java.util.function.Predicate;

import org.junit.Test;
/**
 * 买衣服的服务类
 * @author 734621
 *
 */
public class TransactionService {
	/**
	 * 客户买衣服
	 * @param customer
	 * @param predicate
	 * @param consumer
	 * @return
	 */
	public Customer buyClothes(Customer customer,Predicate<Customer> predicate,Consumer<Customer> consumer){
		if(predicate.test(customer)){//判断客户的等级是否达到折扣的条件 如果达到了就可以折扣
			consumer.accept(customer);//打折扣
		}
		return customer;
	}
	@Test
	public void testBuyClothes(){
		Clothes clothes = new Clothes("羽绒服",1000D);//定义羽绒服,原价为1000
		Customer customers1 = new Customer("Simba",6,clothes);
			customers1 = buyClothes(customers1,
						customer -> customer.getLevel()>=5,//等级大于等于5才有折扣
						customer -> customer.setFreaCount(20D));//折扣是20%
		customers1.getTruePrice();//获得最好的价格
	}
}

最后输出:
羽绒服
原价:1000.0元
Simba,根据你的等级,羽绒服打折后的价格是:800.0元











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值