Arrays 字符数组到Lambda表达式

Arrays 字符数组到Lambda表达式,arrays,loops,java-8,Arrays,Loops,Java 8,我现在正在学习Java中使用的lambda表达式。 在本例中,我在将char[]数组更改为lambda表达式时遇到问题。 所以,我想寻求一些帮助。 我的示例代码如下 Map<String, String> tempMap = new HashMap<String, String>(); tempMap.put("a", "A"); tempMap.put("b", "B"); tempMap.put("c", "C"); tempM

我现在正在学习Java中使用的lambda表达式。 在本例中,我在将char[]数组更改为lambda表达式时遇到问题。 所以,我想寻求一些帮助。 我的示例代码如下

    Map<String, String> tempMap = new HashMap<String, String>();
    tempMap.put("a", "A");
    tempMap.put("b", "B");
    tempMap.put("c", "C");
    tempMap.put("d", "D");
    tempMap.put("e", "E");
    String tempStr = "abcdef";
    StringBuilder tempBuilder = new StringBuilder();
    char[] tempArray = tempStr.toCharArray();
    for(char c : tempArray) {
    tempBuilder.append(tempMap.getOrDefault(String.ValueOf(c),
    String.ValueOf(c));
    }
Map tempMap=newhashmap();
tempMap.put(“a”、“a”);
tempMap.put(“b”、“b”);
tempMap.put(“c”、“c”);
tempMap.put(“d”、“d”);
tempMap.put(“e”、“e”);
字符串tempStr=“abcdef”;
StringBuilder tempBuilder=新的StringBuilder();
char[]tempArray=tempStr.toCharArray();
for(字符c:tempArray){
append(tempMap.getOrDefault(String.ValueOf(c)),
字符串的值(c));
}
结果应该是“ABCDEf”。谢谢

您的意思是像这样使用流吗?

您可以使用创建字符流(比
字符更安全的代理项对),进行转换,然后使用

另一种选择是

这不会处理BMP之外的字符,但只要您注意将它们用作
映射
中的键,代理项对就会正确地组合到结果字符串中的原始形式,就像您原来的
char[]
方法一样

如果要支持BMP以外的字符,可以使用

String output = Pattern.compile("(?!\\p{Cs})").splitAsStream(tempStr)
                       .map(s -> tempMap.getOrDefault(s, s))
                       .collect(Collectors.joining());

首先,你从来不做tempMap.put()表示“f”和“f”。但更重要的是,您告诉了我们您的预期结果是什么,但没有告诉我们您的实际结果。我不太清楚您试图在此处使用lambda表达式的位置。您是在问如何使用流吗?是的,我想将其用于流。如果输入字符串的每个字母都不包含在映射中,则不会更改e、 所以,结果是“ABCDEf”,因为map中没有“f”。谢谢。是的。但我不喜欢使用collect(collector.joining());以获得更好的性能。谢谢。@Hm我没有对性能差异进行基准测试,但它在内部也使用了
StringBuilder
,并且还支持并行化。输入是字符串,可能会有所不同。流中直接输入不合适。首先,我想将tempStr更改为char[]数组,然后循环char[]数组。谢谢。来自@4casle的答案比这个好。:)
String input = "abcdef";
String output = input.codePoints()
                     .mapToObj(Character::toChars)
                     .map(String::valueOf)
                     .map(s -> tempMap.getOrDefault(s, s))
                     .collect(Collectors.joining());
String output = Pattern.compile("").splitAsStream(tempStr)
                       .map(s -> tempMap.getOrDefault(s, s))
                       .collect(Collectors.joining());
String output = Pattern.compile("(?!\\p{Cs})").splitAsStream(tempStr)
                       .map(s -> tempMap.getOrDefault(s, s))
                       .collect(Collectors.joining());