KafkaStreams学习笔记-03

第三章 开发Kafka Streams

书里很多代码都用了lambda表达式和谓词predicate类所以先补一下这方面的知识。

lambda表达式

Java是面向对象语言,不能直接传递代码块,或者说调用方法。如果需要重复使用一个代码块,需要构造一个类或接口的实例,封装这个方法,比较麻烦,因此引入lambda表达式。lambda表达式看起来可以直接调用方法,有点偏向函数式编程的感觉。
格式:
(参数)-> 表达式
表达式可以展开用代码块{}大括号来写
如果无参,不可以省略括号,除非编译器可以推导出参数类型
表达式的返回值无需指定类型

Java中有些接口只封装了一个方法(functional interface),而使用这个方法时常常需要实现接口的实例调用方法【之前常用匿名内部类实现】,这种情况下也可以用lambda表达式,看起来更简洁。

Thread thread1 = new Thread(new Runnable{
   
	@override
	public void run(){
   
		System.out.println("this is a java thread running");
		}
	}
);

可以改写为lambda表达式形式

Thread thread2 = new Thread(()->System.out.println("this is a java thread-lambda running"));

lambda 表达式形式中没有声明Runnable接口,这是因为编译器可以从上下文推断出这里调的是Runnable接口实例。因为Thread类在构造时需要的参数是Runnable接口的实例。

给我的感觉lambda表达式的类型是函数接口的实例,它根据上下文省略了封装该方法的接口的实例化语句。所以其他时候Java可以调用lambda语句,看起来很像直接调用了方法,也可以把lambda表达式赋值给接口。

方法引用又将lambda表达式进一步简写
双冒号运算符::
类名::方法名
常结合lambda表达式,参数是类名下的一个对象,调用了方法,且返回了方法的返回值。

总的来说就是JDK的升级编译器越来越聪明了,能推断的东西越来越多了,所以需要程序源写清楚的就少了,可以简写了,lambda表达式就是一个人例子。

Predicate谓词

谓词是接受一个对象作为参数并根据对象是否匹配给定条件返回真或假的语句。通俗的来说是就是定义一个规则,用来判断对象是否符合规则。一般是一个过滤作用,不符合规则的对象不会继续处理,有点像selector/filter
Predicate在Java8中是一个接口,带泛型<>,接收参数,返回布尔值
常用方法是boolean test(T t);其余是default方法,它是一个functional interface可以用lambda表达式写,比如

Predicate<String, Purchase> isCoffee = (key, purchase) -> purchase.getDepartment().equalsIgnoreCase("coffee");

这是书里的一个代码,这里是用lambda表达式赋值给Predicate接口,表达式的内容相当于重写了接口中的唯一的抽象方法test()【这里其实判断的是purchase对象的内容,但好像书里的意思是test方法需要两个参数?我查了下Java8的API doc是只需要一个参数的,可能这里的Predicate包不一样】
Predicate接口的实例在kafka streams程序中可以配合KStream.branch方法将流数据分裂成进入不同主题的支流。该方法就收一个Predicate实例数组,返回一个包含相等数量KStream实例的数组,每个实例接收与相应谓词匹配的记录。这样branch方法相当于一个容器,容器中是消息选择器,由Predicate实例实现,当消息流经过该方法时,复合第一个Predicate语句的流即被分走,不会做其他判断。如果不符合任何谓词,则被放弃。

开发步骤理解

Kafka Stream API的核心是KStream 对象。许多方法都使用连贯接口的方式。而许多接口都是functional interface,可以用lambda表达式。
fluent interface的核心就是调用方法的对象和方法返回的对象是同一个。非常方便用链式编程处理对象,给我的感觉就是用不同方法对对象进行修饰和更改,比较直观。
但Kafka Stream API的区别是,每此KStream调用一个方法,返回的是一个KStream副本,而不是原来的对象。【为什么?这样设计,优点在哪里?原来的对象去了哪里?,在使用上我如何知道这个对象是copy而不是原来的对象】【从后面的阅读中觉得,这是设计原则,这样对拓扑的增删修改都很友好】

一般开发步骤

  1. 定义Kafka Streams配置
  2. 创建Serde实例,可自定义或用d
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值