Java Stream API 查找对象的长度(toString() 的长度)

Java Stream API to find a lenth of object (the length of toString())

提问人:Sabo 提问时间:11/15/2023 更新时间:11/15/2023 访问量:43

问:

我不明白为什么这个代码片段非静态方法不能从静态上下文中引用

people.stream()
                .mapToInt(String::length)
                .forEach(System.out::println);

原因如下:不存在变量类型的实例,因此 Person 符合 String **

 people.stream()
                .map(String::length)
                .forEach(System.out::println);

相同的逻辑,但执行正确

people.stream()
           
                //.map(Main.Person::toString)
                //.mapToInt(String::length)
                .mapToInt(person->person.toString().length())
                .forEach(System.out::println);

为什么它如此不同,并且 Stream 无法应用操作 String::length?

java-stream 字符串长度

评论

0赞 user207421 11/15/2023
1. 不是 ,因此替换不适用。2. 不是,所以替换不适用。你希望编译器在这里读懂你的想法。PersonStringp->p.length()String.length()staticp->String.length(p)

答:

1赞 Christopher Schneider 11/15/2023 #1

您没有包含完整的示例,但看起来您有此对象:

Collection<Person> people;

如果你在传统的 for 循环中重写你正在做的事情,这就是你要做的事情:

for(Person p : people) {
  String personString = (String)p;
  System.out.println(personString.length());
}

显然,a 不是字符串,因此编译会失败。Person

如果你想得到长度,你必须做你在第三个例子中所做的。要将其编写为流,您可以执行以下操作:

people.stream()
  .map(Person::toString)
  .map(String::length)
  .forEach(System.out::println);

作为传统循环:

for(Person p : people) {
  String personString = p.toString();
  System.out.println(personString.length());
}