new 类().{方法定义}.方法 spark中匿名内部类的使用

有时候看到 new 类().{方法定义}.方法 这种怪异的代码,是匿名内部类的用法。
public class practice {
    public static void main(String[] args) {
        flatMap(new FlatMapFunction() {
            @Override
            public void call() {
                System.out.println("spark接口就是这么调用的");
            }
        });
    }

    static void flatMap(FlatMapFunction tf) {
        tf.call();
    }
}

interface FlatMapFunction {
    void call();
}

要使用接口,就必须实现接口的方法再调用方法。

匿名内部类语法,允许我们不需要单独定义接口,而是在main方法中来实现这个过程。这使得接口实现的修改像if和for一样随意了,比如spark中的一些接口的重载方法。

所谓“内部”是指在方法内调用,”匿名”是指没有给接口的实现类具体命名。

再看看spark的java版本算子,就是用到了匿名内部类,对于没有接触过匿名内部类的人,一定搞得云里雾里。

public class FlatMapOperator {

    public static void main(String[] args){
        SparkConf conf = new SparkConf().setMaster("local").setAppName("flatmap");
        JavaSparkContext sc = new JavaSparkContext(conf);
        List<String> list = Arrays.asList("w1 1","w2 2","w3 3","w4 4");

        JavaRDD<String> listRdd = sc.parallelize(list);

        JavaRDD<String> result = listRdd.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public Iterator<String> call(String s) throws Exception {
                return Arrays.asList(s.split(" ")).iterator();
            }
        });

        result.foreach(new VoidFunction<String>() {
            @Override
            public void call(String s) throws Exception {
                System.err.println(s);
            }
        });
    }
}

 

FlatMapFunction是内部匿名类的声明,<String, String> 是接口的模板,call是重载的接口方法。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值