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/