【发布时间】:2016-11-09 20:09:45
【问题描述】:
所以我正在做一个项目,我必须将包含希腊字母的字符串转换为包含该字母的英文表示的字符串。所以希腊语的α 会变成alpha 而Α 会变成Alpha。
我创建了一个 HashMap,它具有从 Unicode 字符到普通字符串的适当转换。
我使用了一个简单的For 循环来检查输入String 中的Char 是否是HashMap 中的Key,如果是,那么我将使用@987654330 附加它的替换@。这是我用来执行此操作的代码:
char[] ca = snippet.toCharArray();
StringBuilder out = new StringBuilder();
for (char c : ca) {
if (GREEK_LETTER_DICT.containsKey(Character.toString(c))) {
out.append( GREEK_LETTER_DICT.get(Character.toString(c)));
} else {
out.append(c);
}
}
return out.toString();
这是一个以String 作为输入的公共静态方法。
我想知道的是是否可以用 lambda 表达式做同样的事情?我已经找到了几个解决方案来替换String 中的Character,但它们不使用HashMap/Dictionary。
我知道仅仅为了使用 lambda 表达式而将其转换为 lambda 表达式是完全没用的,但是因为我还有另外 7 个这样的函数将我的代码缩短了近 60%,我想看看它是否完全有可能在“一行”代码中做到这一点。这样我可以减少我使用的单独方法的数量并获得更清晰的代码。
到目前为止,我已经找到了一种将String 转换为Stream 的方法:
String.chars()
然后将此IntStream 转换为Stream<Character>
.mapToObj(ch -> (char) ch)
并过滤以查看Character 是否在HashMap 中
.filter(ch -> (GREEK_LETTER_DICT.containsKey(ch)))
问题在于我做不到
- 将原始
Character附加到输出String如果它不在HashMap中 - 将
Character替换为HashMap中的字符串
因此,感谢您对这两点的任何帮助。我发现有时我想错了,因为不是查看String 中的Character 是否等于选项列表中的Character,我应该检查该选项列表是否返回正值index。所以这个(伪代码):
"StringWithOptions".indexOf('characterLiteral')
而不是这个:
Character.equals("One|of|these")
【问题讨论】:
-
基于有问题的代码
str.chars().forEach(character -> out.append(GREEK_LETTER_DICT.getOrDefault(Character.toString(c), c))); -
那很快 ;-) 感谢您的回复。使用此代码能够使其正常工作。我会把它放在这里。我不得不对代码进行一些更改。
-
@SMA 美丽。我建议您将其放入答案中。