JavaRush /Java 博客 /Random-ZH /茶歇#163。lambda 和方法引用有什么区别。在 Java 中连接 Null 字符串的 5 种方法

茶歇#163。lambda 和方法引用有什么区别。在 Java 中连接 Null 字符串的 5 种方法

已在 Random-ZH 群组中发布

lambda 和方法引用有什么区别

来源:Reddit IntelliJ IDEA 建议用方法引用替换 lambda 表达式。它们之间有什么区别? 茶歇#163。 lambda 和方法引用有什么区别。 在 Java 中连接 Null 字符串的 5 种方法 - 1事实证明,lambda 表达式和方法引用之间存在细微差别。例如,比较:myInstance::getStuff() ->myInstance.getStuff()。一般来说,这两个选项是等效的。但是,如果 myInstance 为 null,并且 lambda 在计算 lambda 时生成空指针,则在尝试访问引用时将立即生成方法引用。还有什么?一般来说,如果计算 lambda 表达式的代码位于带有空指针的 try-catch 内,这一点很重要。例如,我有一个函数mightBeNull(Supplier<T> function),它执行如下操作:
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
如果调用mightBeNull(() -> myNullVariable.getStuff())不会引发异常,那么“等效”:mightBeNull(myNullVariable::getStuff)将在调用该函数时立即引发 NullPointerException。这就是区别。 笔记。根据 Stackoverflow 的说法,如果用方法引用替换 lambda,类字节码将更加紧凑,这意味着类将更快地加载到 JVM 中。然而,为了体验这样的增益,需要数千个未优化的 lambda。然而,在大型项目中,这样的数字很容易累积。否则,在 lambda 和方法引用之间进行选择取决于品味和代码可读性。例如,如果 lambda 有几行,那么可读性就会降低,并且只有将 lambda 放置在单独的方法中并使用对其的引用时,代码才会受益。

在 Java 中连接 Null 字符串的 5 种方法

来源:Gitconnected 阅读本文后,您将了解更多在 Java 中使用字符串的方法。 Java提供了很多连接字符串的方法,但有时当我们不注意空字符串时,最终可能会得到null,这显然不是我们想要的。所以使用我推荐的方法来避免连接字符串时出现空值。

问题分析

如果我们想连接字符串数组,我们可以简单地使用 + 运算符。然而,我们这样做的时候可能会遇到值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
结合所有这些元素我们得到这样的结果:
https://gist.github.comnull
虽然我们发现了问题,但生成的null 值也连接为字符串,这显然不是我们所希望的。即使我们使用 Java 8 或更高版本,使用静态String.join()方法来连接字符串,我们仍然会得到null值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
结果是一样的:
https://gist.github.comnull
那么如何解决这个问题呢?有几种解决方案。为了方便后面演示代码,我们提取了一个可以传递字符串并返回非空字符串的方法。
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. String.concat()

String.concat()是String类自带的方法。对于字符串连接来说非常方便。
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
由于调用了nullToString()方法,因此结果中不存在null值。

2.字符串生成器

StringBuilder类提供了许多有用且方便的方法来构造字符串。其中最常用的是append()方法,它使用append()来连接字符串,并与nullToString()方法结合使用以避免值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
结果,您可以获得以下结果:
https://gist.github.com

3.StringJoiner类(Java 8+)

StringJoiner类提供了更强大的连接字符串的功能。它不仅可以指定连接时的分隔符,还可以指定前缀和后缀。在连接字符串时,我们可以使用它的add()方法。这里还将使用nullToString()方法来避免值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(nullToString(value));
}

4. Streams.filter (Java 8+)

Stream API是Java 8中引入的一个强大的流操作类,可以执行标准的过滤、匹配、遍历、分组、统计等操作。
  • 过滤器操作过滤器可以接收一个Predicate函数。
  • Predicate函数的接口与前面介绍的Function接口相同。
  • 这是一个函数式接口。
  • 它可以采用泛型参数<T>,返回值是布尔类型。
  • 谓词常用于过滤数据。
因此,我们可以定义一个谓词来检查字符串并将其从 Stream API传递给filter()方法。此外,您可以使用Collectors.joining()方法来连接剩余的非空字符串。
String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5.使用+运算符

使用+运算符也可能解决问题,但不建议这样做。我们知道String是一个不可变的对象。使用+号往往会创建一个字符串对象,每次都会在内存中创建一个新的字符串,所以使用+号连接字符串的性能消耗非常高。

结论

本文介绍了几种连接字符串和处理NULL的方法,不同的方法可能适合不同的场景。分析表明StringBuilder的性能是最好的。但在实际情况下,你需要结合一定的场景,然后选择性能损失最小的方法。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION