从 Java 8 中的过滤器和映射调用自定义静态函数 - 流



我想调用方法名称nameStartingWithPrefix((,它在过滤器内部,其定义将在过滤器类中。

所有 ArrayList 都在 main(( 中描述,但列表不像在参数中那样传递,我如何在 Filter.nameStartingWithPrefix(( 中调用名称列表。

语法如下:

names 是 ArrayList 的名称,位于 main(( 中

names.stream()
.filter(Filter.nameStartingWithPrefix(scanner.nextLine()))
.map(Mapper.getDistinctCharactersCount())
.forEachOrdered(System.out::println);

下面是代码示例:

public class FilterMapper {
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
List<String> names = Arrays.asList(
"aaryanna",
"aayanna",
"airianna",
"alassandra",
"allanna",
"allannah",
"allessandra",
"allianna",
"allyanna",
"anastaisa",
"anastashia",
"anastasia",
"annabella",
"annabelle",
"annebelle"
);
names.stream()
.filter(Filter.nameStartingWithPrefix(scanner.nextLine()))
.map(Mapper.getDistinctCharactersCount())
.forEachOrdered(System.out::println);
}
}
class Filter{
public static String nameStartingWithPrefix(String prefix)
{
}
}
  1. 预期,我必须在 Filter 方法上编写一个代码,该代码根据用户在运行时给出的前缀过滤名称。 但是我无法根据给定的代码访问列表。你能帮我如何访问过滤器类中的名字列表吗?

    1. 我认为List应该在(Filter.nameStartingWithPrefix(scanner.nextLine((((的参数中传递 但它不在那里。
The Filter and Mapper implementation is followed as - 
class Filter {
public static Predicate<String> nameStartingWithPrefix(String prefix) {
return n -> n.startsWith(prefix);
}
}
class Mapper {
public static Function<String, CharactersCount> getDistinctCharactersCount() {
return s -> new CharactersCount(s, (int)s.chars().distinct().count());
}
}
class CharactersCount {
private final String name;
private final Integer distinctCharacterCount;
public CharactersCount(String name, Integer distinctCharacterCount) {
this.name = name;
this.distinctCharacterCount = distinctCharacterCount;
}
@Override
public String toString() {
return """ + this.name + "" has " + this.distinctCharacterCount + " distinct characters.";
}
}

由于您正在使用自定义筛选器类通过流调用筛选器。 filter 函数需要一个谓词,因此您需要创建一个自定义谓词并从 nameStartingWithPrefix 函数返回它。

同样,您将需要为映射器创建一个函数,并从该函数返回它。

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import java.util.function.Function;
import java.util.function.Predicate;
class Filter {
public static Predicate<String> nameStartingWithPrefix(String nextLine) {
return new Predicate<String>() {
@Override
public boolean test(String t) {
// System.out.println(t);
return t.startsWith(nextLine);
}
};
}
}

public class Solution1 {
private static final Scanner scanner = new Scanner(System.in);
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<String> names = Arrays.asList(
"aaryanna",
"aayanna",
"airianna",
"alassandra",
"allanna",
"allannah",
"allessandra",
"allianna",
"allyanna",
"anastaisa",
"anastashia",
"anastasia",
"annabella",
"annabelle",
"annebelle"
);
names.stream().filter(Filter.nameStartingWithPrefix(scanner.nextLine()))
.map(Mapper.getDistinctCharactersCount()).forEachOrdered(System.out::println);
}
}

有关过滤器和地图的进一步说明,请查看以下链接:

谓词函数的文档 : https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html#test-T-

地图视频说明:https://www.youtube.com/watch?v=bTTNVP_ORr8

过滤器的视频说明:https://www.youtube.com/watch?v=vHwToYEYvsU

注意:请按照 Stackoverflow 指南提问。

small correction in Mapper class
it should be like this (just we need to create object and we need to enclose inner class and methods)
class Mapper {
public static Function<String, CharactersCount> getDistinctCharactersCount() {
FilterMapper fm = new FilterMapper();
return s -> fm.new CharactersCount(s, (int) s.chars().distinct().count());
}
}

最新更新