File inputF = new File("C:\\sample.csv"); //Line 1
  InputStream inputFS = new FileInputStream(inputF); //Line2
  BufferedReader br = new BufferedReader(new InputStreamReader(inputFS)); // Line3
  inputList = br.lines().skip(1).map(createObject).collect(Collectors.toList()); // Line 4 Function createobject below


在上面的第四行中,我将从CSV文件中读取的行列表传递给下面的函数createObject。我也有另一个具有项目列表的csv文件。假设我在上面的函数中也阅读了第二个文件,现在如何将第二个文件中的行列表与第一个文件一起传递给createObject Function。我也想传递第二个文件,因为我想检查第二个文件中是否存在第一个文件中的项目

public static Function<String, YouJavaItem> createObject= (line) -> {
        List<String> firstFile= Arrays.asList(line.split(","));


示例:我要检查firstFile.get(2)是否说file2 {“ lmn”,“ ukl”,“ xyz”,“ abc”}中的项目列表中存在“ abc”

最佳答案

您需要将createObject声明为BiFunction<String,List<String>,YourJavaObject>,以便它既可以接受当前行,也可以接受从第二个文件读取的List<String>

您可以在读取第一个文件之前将第二个文件读入List,因为第一个文件的每个元素都需要它的内容:

List<String> secondFileContents = Files.readAllLines(Paths.get("C:\\secondFile"));


现在,您可以使用它传递给您的createObject-这将需要一个参数。

Path firstFile = Paths.get("C:\\sample.csv");
List<YourJavaItem> result = Files.lines(firstFile).skip(1)
                .map(line -> YourClass.createObject(line, secondFileContents))
                .collect(Collectors.toList());


对于您的示例,createObject方法可能如下所示:

BiFunction<String,List<String>,YourJavaItem> createObject =
    (line, sfc) -> {
        if ("abc".equals(sfc.get(2))) {
            System.out.println("abc found!");
        }
        return new YourJavaItem(line);
    }
}


如果只想创建一个不包含第二个文件中项目的List<String>,则可以过滤:

List<String> result = Files.lines(firstFile).skip(1)
         .flatMap(line -> Arrays.asList(line).stream()
                          .filter(item -> !secondfileContents.contains(item)))
         .collect(Collectors.toList());


使用就地lambda

如果您在读取行的函数中将createObject定义为lambda,则仍然可以使用Function<String,YourJavaObject>并引用从第二个文件读取的本地定义的List<String>

List<String> secondFileContents = Files.readAllLines(Paths.get("C:\\secondFile"));
Function<String,YourJavaObject> mapper = line -> {
    if ("abc".equals(secondFileContents.get(2))) {
        System.out.println("abc found!");
    }
    return new YourJavaItem(line);
}
List<YourJavaItem> result = Files.lines(firstFile).skip(1)
                                .map(mapper)
                                .collect(Collectors.toList());

关于java - Map函数Java 8的多个输入参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49960806/

10-12 00:19