关于java中的函数式编程思想

(注:本人编程小白,利用网络上的资源自学java,以下内容是我的学习笔记及感悟,可能会有描述不准确甚至错误的情况,还请各位大佬多多指教;如果你跟我一样也是属于入门学习阶段,建议仅将以下内容作为参考,不要过度相信)

关于函数式接口:

定义:有且仅有一个抽象方法的接口

代码示例:

关于接口:

@FunctionalInterface
//强制检查是否符合函数式接口(有且仅有一个抽象方法)
public interface MyDIYlambdaInterface {
    void mymethod();//public abstract可省略
}

关于方法

//自定义的接口可作为参数
public class Demotry {
    public static void dosomething(MyDIYlambdaInterface myin){
        myin.mymethod();
    }
//实现示例:重写接口中的抽象方法
    public static void main(String[] args) {
    dosomething(()-> System.out.println("========"));
    }
}

Lambda的延迟执行

解决性能浪费问题

关于接口

@FunctionalInterface//强制检查是否符合函数式接口(有且仅有一个抽象方法)
public interface MyDIYlambdaInterface {
    String messageBuilder();
}

关于方法

public class Demotry {
  public static void log(int i,MyDIYlambdaInterface myin){
      if(i==1){
          System.out.println(myin.messageBuilder());
      }
  }

    public static void main(String[] args) {
        String a="Happy birthday ";
        String b="to ";
        String c="you";
        log(1,()->a+b+c);
    }
}

输出结果:“Happy birthday to you”

这样做的原因:

如果是常规写法,在log方法中直接sout,即使传入的int数据不符合要求,字符串也已经被拼接,但是又无法输出,就会造成浪费。
而如果将抽象方法封装在接口中,该接口作为log方法的参数,然后在主方法中调用方法时如果前一个参数符合,再重写所需操作,就可以解决这个问题。

常用的函数式接口

Supplier

java.util.function.Supplier 接口仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对
象数据。

Consumer

java.util.function.Consumer ,如其名,“消费数据”,其数据类型由泛型决定。

!!!Predicate

java.util.function.Predicate
方法: boolean test(T t) :用于判断

应用:筛选合适信息
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class DemoPredicate {
    public static void main(String[] args) {
        String[] array={"迪丽热巴,女","易烊千玺,男","宋威龙,男","刘诗诗,女"};
        List<String> list =Mytest(array, s-> "女".equals(s.split(",")[1]),
                s-> s.split(",")[0].length() == 4);
        System.out.println(list);
    }
    public static List<String> Mytest(String[] array,Predicate<String> one,Predicate<String> two){
        List<String> newlist=new ArrayList<>();
        for (String every:array)//遍历这个放进去的集合
        { if(one.and(two).test(every)){
                 newlist.add(every);
        }

        }
        return newlist;
    }
}

Function – java.util.function.Function<T,R> 根据T类型,得到R类型

抽象方法:apply : R apply(T t)

例子:提取所需年龄数据字符串,转换为整型并输出
import java.util.function.Function;

public class AboutFunction {
    public static void main(String[] args) {
String goal="刘诗诗,30";
String age=goal.split(",")[1];//将年龄字符串提取出来
        System.out.println(Myadd(age,s->Integer.parseInt(s)));


    }
    public static int Myadd(String age,Function<String,Integer> fun){
return fun.apply(age);
    }

输出结果:30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值