![java 扩展名](https://i-blog.csdnimg.cn/blog_migrate/f7e2c5033d4b7a89a16281660e69ee46.png)
java 扩展名
还可以使用扩展方法吗?
显然,有一个名为XTend的Java方言可以做到这一点,但是Java中没有明显的扩展方法。
我从C#回忆起,扩展方法允许您定义如下内容:
int myExtensionMethod(SomeClass theExtendee, Object input) {
return ...;
}
SomeClass myExtendable = new SomeClass();
// I'm calling this as though it's a member of the class
myExtendable.myExtensionMethod(someInput);
// as opposed to calling it as a wrapper
myExtensionMethod(myExtendable, someInput);
您可以在Java中执行第二步,为什么不呢?
流中的可重用性
在Java流中,我们使用了一种流利的语法。 让我们考虑以下示例:
Stream<String> someValues = someSource().stream()
.map(Source::getParticularField)
.map(Field::getParticularChild)
.map(Object::toString)
.filter(not(String::isBlank))
.map(String::toUpperCase);
上面的算法分为三个阶段:
- 选择数据源
- 深入到
particularChild
对象 - 转换为大写的非空白字符串
其中的后两个可能会变成可重用的组件:
public static Stream<Child> drillDown(Stream<Source> source) {
return source.map(Source::getParticularField)
.map(Field::getParticularChild);
}
public static <T> Stream<String> nonBlankUppercase(Stream<T> source) {
return source.map(Object::toString)
.filter(not(String::isBlank))
.map(String::toUpperCase);
}
问题在于,使用它们看起来将涉及一些嵌套:
Stream<String> someValues = nonBlankUppercase(
drillDown(someSource().stream()));
与原著的流畅/前卫性质相比,这不仅有点难读,而且倒退了。
我们可以通过流解决这个问题!
但是,今天我想到可以通过Java中的流解决此问题。 绝对值得考虑使用流和Optional的类似于流的接口的其他方式可以使我们流畅地进行转换:
Stream<String> someValues = someSource().stream()
.flatMap(item -> drillDown(Stream.of(item)))
.flatMap(item -> nonBlankUppercase(Stream.of(item)));
这几乎是有用的类别...
扩展会更好,但是…
翻译自: https://www.javacodegeeks.com/java-extension-methods.html
java 扩展名