采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集

经常会用到java8的lambda表达式对list进行操作,记录一下,一般的javaList 交、并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的javaList对象,采用java8 lambda表达式流操作则可以不影响原始list对象而得到两个javaList对象的 交、并、差集。

具体代码如下:

// JAVA CODE

import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list1 = new ArrayList();
list1.add("1111&#8221;);
list1.add("2222&#8221;);
list1.add("3333&#8221;);
List<String> list2 = new ArrayList();
list2.add("3333&#8221;);
list2.add("4444&#8221;);
list2.add("5555&#8221;);
// 交集
List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
System.out.println("&#8212;得到交集 intersection&#8212;");
intersection.parallelStream().forEach(System.out : println);
// 差集 (list1 - list2)
List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
System.out.println("&#8212;得到差集 reduce1 (list1 - list2)&#8212;");
reduce1.parallelStream().forEach(System.out : println);
// 差集 (list2 - list1)
List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
System.out.println("&#8212;得到差集 reduce2 (list2 - list1)&#8212;");
reduce2.parallelStream().forEach(System.out : println);
// 并集
List<String> listAll = list1.parallelStream().collect(toList());
List<String> listAll2 = list2.parallelStream().collect(toList());
listAll.addAll(listAll2);
System.out.println("&#8212;得到并集 listAll&#8212;");
listAll.parallelStream().forEach(System.out : println);
// 去重并集
List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
System.out.println("&#8212;得到去重并集 listAllDistinct&#8212;");
listAllDistinct.parallelStream().forEach(System.out : println);
System.out.println("&#8212;原来的List1&#8212;");
list1.parallelStream().forEach(System.out : println);
System.out.println("&#8212;原来的List2&#8212;");
list2.parallelStream().forEach(System.out : println);
// 一般有filter 操作时,不用并行流parallelStream ,如果用的话可能会导致线程安全问题
}
}

参考:https://blog.csdn.net/gzt19881123/article/details/78327465

Apache poi读取excel数字是科学计数法的问题

前几天在做项目的时候,对一个excel文件进行解析的时候,因为需要读取数字列,然后我就写用apach的poi工具集进行读取,发现读取的数字是科学计数法,经过了解发现无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式。

// JAVA CODE

public static Double getStringCell(XSSFRow row, int colNum) {
String value = null;
short lastCellNum = row.getLastCellNum();
if (lastCellNum > colNum) {
XSSFCell xssfCell = row.getCell(colNum);
if (xssfCell != null) {
value = xssfCell.getNumericCellValue();
}
}
return value;
}

那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了。 我们就可以用DecimalFormat对这个double转换一下得到的就是我们要的值了。

// JAVA CODE

public static Double getStringCell(XSSFRow row, int colNum) {
String value = null;
short lastCellNum = row.getLastCellNum();
if (lastCellNum > colNum) {
XSSFCell xssfCell = row.getCell(colNum);
if (xssfCell != null) {
value = xssfCell.toString();
String eChar = "E&#8221;;
if(value.contains(eChar)){
DecimalFormat df = new DecimalFormat("0.######&#8221;); //后面的###代表保留后面6位小数,会自动进行调整如果是1000000000.25632则会显示1000000000.25632
value = df.format(xssfCell.getNumericCellValue());
}
}
}
return value;
}