栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

记一次 PropertyMapper 使用

记一次 PropertyMapper 使用

PropertyMapper

背景

它是啥 START

它有啥

构造SourceOperatorSource 它咋用

fromtowhenas 开始用end

背景

最近开始研究 kafka ,发现了一个有意思的类 PropertyMapper。
内部使用了函数式编程,再次不做深入讲解,若对函数式编程不理解的小伙伴,可以先取了解一下。

它是啥

它是一个String 的工具类,用于将值从提供的源映射到目标。
再这过程中,可以对值进行调整以及判断。

START 它有啥 构造


大伙看到这层嵌套,是不是觉得有点装饰器的味道了<( ̄ˇ ̄)/

上面说了,它在赋值的过程中是可以对值进行调整以及判断,那么用了装饰者,就可以在定义一个带有规则的 PropertyMapper 基础上对它进行更多的职能赋值~

SourceOperator


这是一个 source(PropertyMapper 定义 待会会介绍到) 的操作接口,对传入的值进行自定义的逻辑处理。

Source

supplier 需要处理的来源值predicate 自定义的校验逻辑 它咋用 from

public  Source from(Supplier supplier) {
		Assert.notNull(supplier, "Supplier must not be null");
		Source source = getSource(supplier);
		if (this.sourceOperator != null) {
			source = this.sourceOperator.apply(source);
		}
		return source;
	}

这个方法会将传入的值进行封装,封装成source对象,进行相对应的赋值以及自定义的校验判断。

to
public void to(Consumer consumer) {
			Assert.notNull(consumer, "Consumer must not be null");
			T value = this.supplier.get();
			if (this.predicate.test(value)) {
				consumer.accept(value);
			}
		}

这方法将最终校验过的值,赋值给消费者。

when
	public Source when(Predicate predicate) {
			Assert.notNull(predicate, "Predicate must not be null");
			return new Source<>(this.supplier, predicate);
		}

此方法使用频率较高,传入自定义的逻辑校验。

as
public  Source as(Function adapter) {
			Assert.notNull(adapter, "Adapter must not be null");
			Supplier test = () -> this.predicate.test(this.supplier.get());
			Predicate predicate = (t) -> test.get();
			Supplier supplier = () -> {
				if (test.get()) {
					return adapter.apply(this.supplier.get());
				}
				return null;
			};
			return new Source<>(supplier, predicate);
		}

此方法 传入的是 Function ,会处理你想要将值进行你想要的操作。那么我们来实际操作一下。

开始用
  public void testPropertyMapper(String source, List target) {
    PropertyMapper propertyMapper = PropertyMapper.get();
    propertyMapper.from(source)
        .when((x) -> x.length() > 4)
        .as(x -> x + "asd")
        .to(target::add);
  }

如上,这段代码就会将长度大于4的字符串,加上 “asd” 后,添加到 target 中。
ps(别说java 8 的 stream 也可以做到!!别钻牛角尖!!!)

它也提供了一个校验非 null 的方法

PropertyMapper.get().alwaysApplyingWhenNonNull();

它的 SourceOperator 设置了一个

private static class NullPointerExceptionSafeSupplier implements Supplier {

		private final Supplier supplier;

		NullPointerExceptionSafeSupplier(Supplier supplier) {
			this.supplier = supplier;
		}

		@Override
		public T get() {
			try {
				return this.supplier.get();
			}
			catch (NullPointerException ex) {
				return null;
			}
		}

	}

由此,可以参考编写自己的校验逻辑。

end

此文档仅做一次技术点的使用,所以并没有过多讲解哈!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722464.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号