最近有人建议从JDK 12中删除Java预览功能Raw String Literals ( JEP 326 ), 现在正式宣布将删除预览功能 ( Java SE 12 [JSR 386] 25版将其删除 )。 JDK String类中已经添加了几种方法来支持此功能。 即使在删除原始字符串文字预览功能之后,在JDK 12之前的JDK版本中添加的那些方法(例如String :: lines )仍可能保持可用。 但是,已经决定应该将JDK 12中添加到String
一种方法( String::align
) 从JDK 12中删除,作为删除原始字符串文字的一部分。 方法String :: transform已添加到JDK 12中 ,本文的其余部分详细介绍了String::transform
(目前在JDK 12中实现),并讨论了为什么其已引起争议的简短历史暗示它可能是潜在的候选者与原始字符串文字一起删除。
自Build 22 ( Build 24 [ 2018年12月15日 ]是本文撰写时的最新可用版本)以来,当前的String::transform
实现已在JDK 12 Early Access Build中提供,并通过JDK-8203442引入(“ String :: transform” )。
关于将这种方法添加到JDK的讨论很多。 以下项目符号概述了关键的讨论要点。
- 吉姆·拉斯基(Jim Laskey)写道 ,
String::transform
的“起源目标”是“为那些不满意String::align()
开发人员提供自定义对齐方法”- 自从
String::transform
上的帖子以来, 已将String::align
添加到JDK 12中, 然后从中删除 。
- 自从
- 其他消息进一步描述了
String::transform
的动机,意图和好处:- RémiForax写道 :“……能够从左到右流利地编写代码真是太好了……”
- 吉姆·拉斯基(Jim Laskey)写道 :“ String :: transform旨在以最通用的字符串形式促进对原始字符串文字的自定义操作(对齐)。”
- JDK-8203442的“描述”指出,“ String :: transform实例方法允许将lambda函数应用到字符串。”
- JDK-8203703提供了一些示例,以说明与静态方法相比,使用String :: transform可以“……更清楚地辨别步骤”,在静态方法中,“阅读器被迫从内而外地解释表达式的各个部分”。
-
String::transform
最初返回String
,但是后来被更改为返回Object
, 吉姆·拉斯基(Jim Laskey)撰写了有关该更改的文章 ,“当其他类型的类型也可能相关时,'transform'变成通用的。” 他总结说:“我可能会回到仅仅支持String
。” - 提出以下一些名称(按字母顺序列出)时,
String::transform
的命名一直具有挑战性 :- “ 申请 ”
- “ applyMutation ”(由AWS开发工具包使用 ,但并非所有人都喜欢 )
- “ asInputTo “
- “ 连锁 ”
- “ 地图 ”( 暂时命名为,但存在一些顾虑 )
- “ 过程 ”
- “ 与 ”
- RémiForax写道 :“ [需要更多的变体(
transformToInt
,transformToLong
,transformToDouble
)才有用。” - Brian Goetz描述了为什么当前计划是通过
String::transform
方法而不是诸如|>
类的运算符来实现此功能的。 - 斯图尔特·马克斯(Stuart Marks)写道 :“这个特殊的决定[
String::transform
]为在其他类上执行类似操作的方法使用名称'transform'开创了先例”,并引用了JDK-8140283和JDK-8214753 :- JDK-8140283提议为Stream和Optional添加“
chain
”方法,以便在使用对Stream
或Optional
起作用并返回某些内容的方法时,“缓解”管线级线性流的“破坏”。本身是“可链接的”)。 - JDK-8214753建议添加“
Optional::transform
”,以允许“对Optional
进行任意操作”。
- JDK-8140283提议为Stream和Optional添加“
- 关于将
String::transform
添加到OpenJDK 12的方式,存在一些困惑和惊ster,但是Stuart Marks的消息总结了导致添加此方法的事件。- Marks的消息状态中有一个特别有趣的句子(我已经强调了一点 ):“尽管这个API点是独立存在的 ,但这确实是Jim的RSL工作的一部分,其中包括对String的一些API附加功能,这可能会产生重大影响关于如何在Java代码中使用
String
文字。”
- Marks的消息状态中有一个特别有趣的句子(我已经强调了一点 ):“尽管这个API点是独立存在的 ,但这确实是Jim的RSL工作的一部分,其中包括对String的一些API附加功能,这可能会产生重大影响关于如何在Java代码中使用
- Tomasz Linkowski指出 ,
String::transform
(以及添加到Stream
任何类似方法)很可能会在某些情况下使用,而在某些情况下,无需新方法便可以更轻松地完成相同的事情。 他提供的可能滥用String::transform
的示例是“string.transform(String::toLowerCase)
”和“stream.chain(s->s.map(mapper))
”。
两个在线示例演示了String::transform
如何在最常见的用例中使用:
- JDK-8203703 (“ String :: transform”)提供了一个“解决方案”示例,该示例演示了
String::transform
如何通过允许从左到右(而不是从左到右)读取作用在String
的操作来提高代码的可读性。阅读“从内而外”。 - 甲芯库-dev邮件列表上的消息提供了使用的一个例子
String::transform
到一个转换String
成比其他的类的实例String
。
Stephen Colebourne提出了同样的问题,我想知道当我从JDK 12中删除原始字符串文字时:“考虑到原始字符串的删除及其有争议的性质, String::transform
将被删除?” 尽管我没有看到关于String::transform
是否将保留在JDK 12中的任何权威性和权威性,但有三点证据使我认为它会继续存在。
- 我还没有看到任何说要删除
String::transform
,该信息从Early Access Build 22开始已经存在于JDK 12中。 写了一些问题来删除与原始字符串文字相关的编译器支持 ,甚至删除另一个String方法 (String::align
),但是我不知道为String::transform
写的类似问题。 - 有人说,虽然
String::transform
是作为原始字符串文字工作的一部分添加的,但也有人说String::transform
“独立的”。 - 我之前引用的有关如何使用此方法的两个示例不依赖或不需要原始字符串文字。 换句话说,无论是否存在原始字符串文字,都可以使用该方法。
String::transform
已经存在了很短的时间( 不到一年 ),但是已经有很长的历史了。 该方法当前在JDK 12中可用(自Early Access Build 22起),我怀疑尽管从JDK 12中删除了原始字符串文字,但它仍将是String
的API的一部分。
翻译自: https://www.javacodegeeks.com/2018/12/complicated-history-jdk-12s-string.html