目录
6、parallelstream foreach和for each
1、array.length的<,<=,-1问题
String[] arrLine = {"1","2","3","4"};
for(int i = 0;i<arrLine.length;i++){
System.out.println(arrLine[i]);
//从数组的第一个元素开始,到数组的最后一个元素,遍历元素范围:arr[0]到arr[3],1,2,3,4
}
for(int i = 0;i<=arrLine.length;i++){
System.out.println(arrLine[i]);
//会产生数组越界,数组元素下标到达不了4
}
for(int i = 0;i<arrLine.length-1;i++){
System.out.println(arrLine[i]);
//从数组的第一个元素开始,到数组的到第二个元素,遍历元素范围:arr[0]到arr[2],1,2,3
}
for(int i = 0;i<=arrLine.length-1;i++){
System.out.println(arrLine[i]);
//从数组的第一个元素开始,到数组的到最后一个元素,遍历元素范围:arr[0]到arr[3],1,2,3,4
}
2、字符串去除前面的不定数量的0或者其他相同字符
String str = "000001230";
String str1 = "00249";
String str2 = "***我di";
String str3 = String.valueOf(Integer.valueOf(str1));
System.out.println(str.replaceFirst("^0*","")); //1230
System.out.println(str3); //249
System.out.println(str2.replaceFirst("^\\**","")); //我di (*先用\\转义)
3、取文件路径并生成不重复后缀
File oldFile = new File("F:\\采购单7500003219.pdf");
File newExcel = new File(oldFile.toString().split("\\.pdf")[0] + "_" + System.currentTimeMillis() + ".xlsx");
System.out.println(oldFile.getAbsolutePath().toLowerCase().split("\\.pdf")[0]); // f:\采购单7500003219
System.out.println(oldFile.toString().split("\\.pdf")[0]);// F:\采购单7500003219
System.out.println(newExcel); // F:\采购单7500003219_1666949223006.xlsx
System.out.println("System.currentTimeMillis()结果是:"+System.currentTimeMillis()+"\n"+"new Date()结果是"+new Date());
//System.currentTimeMillis()结果是:1666949493869
//new Date()结果是Fri Oct 28 17:31:33 CST 2022
4、String和Date互转,十二月英文转换
DateFormat dtFmt = new SimpleDateFormat("yyMMdd");
String dateStr = dtFmt.format(new Date());
System.out.println(dateStr);//231108
private Date getDateFromStr(String str) {
String[] arr = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "Sep", "OCT", "NOV", "DEC"};
String arrLine[]=str.split("/");
String date=arrLine[0];
for (int i = 0; i < arr.length; i++) {
if (arrLine[1].equalsIgnoreCase(arr[i])) {
int month = (i + 1);
date+="/"+month+"/"+arrLine[2];
}
}
return string2Date(date, "dd/MM/yy");
}
private Date getDateFromStr(String str) {
String[] arr = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "Sep", "OCT", "NOV", "DEC"};
String arrLine[]=str.split("/");
String date=arrLine[0];
for (int i = 0; i < arr.length; i++) {
if (arrLine[1].equalsIgnoreCase(arr[i])) {
int month = (i + 1);
date+="/"+month+"/"+arrLine[2];
}
}
return string2Date(date, "dd/MM/yy");
}
public static String date2String(Date date, String format) {
if (date == null) {
return "";
} else {
SimpleDateFormat sdf = null;
try {
sdf = new SimpleDateFormat(format);
} catch (Exception var4) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.debug("====DateUtils.date2String(" + date + "," + format);
}
return sdf.format(date);
}
}
public static Date string2Date(String date, String dateFormat) {
if (ObjectUtils.isEmpty(date)) {
return null;
} else {
try {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
long time = sdf.parse(date).getTime();
return new Date(time);
} catch (Exception var5) {
log.error("unsupported date format : " + date);
throw new RuntimeException("时间格式不正确:" + date + ",正确格式:" + dateFormat);
}
}
}
5、list取第一个实体
//先判空
List.iterator().next();
list.get(0)
/**List.iterator().next()和List.get(0)在获取集合中的第一个元素上是等效的。它们都可以用于获取集合中的第一个元素。
List.get(0)使用了集合的get()方法,返回指定索引位置的元素。如果索引位置为0,就表示获取第一个元素。
而List.iterator().next()使用了迭代器的next()方法来获取迭代器指向的第一个元素。由于迭代器是用于遍历集合的,所以通过调用next()方法,可以获取第一个元素。
对于获取集合中的第一个元素,List.get(0)方法更加简洁和直观。它通过指定索引位置来直接获取第一个元素,代码可读性较高。
相比之下,List.iterator().next()方法需要先获取一个迭代器对象,然后调用next()方法来获取第一个元素。虽然两者在功能上是等效的,但是代码的可读性稍低于List.get(0)。
因此,如果你只需要获取集合中的第一个元素,建议使用List.get(0)方法。它更加简洁、直观和易于理解。如果你需要使用迭代器遍历整个集合,那么才需要使用iterator().next()方法。
因此,这两种方式在获取集合中第一个元素时是等效的,可以根据个人喜好和具体情况选择使用哪种方式。**/
6、parallelstream foreach和for each
//可以直接organizationVOList.foreach,也可以如下
organizationVOList.parallelStream().forEach(org -> {
if (org.getEnabled() == true) {
organizationMapper.update(null,
Wrappers.lambdaUpdate(OrganizationDO.class)
.set(OrganizationDO::getEnabled, false)
.set(OrganizationDO::getModifierUuid, loginUser.getUuid())
.set(OrganizationDO::getModifier, loginUser.getName())
.set(OrganizationDO::getModifyTime, new Date())
.eq(OrganizationDO::getOrgCode, o.getOrgCode()));
}
}
);
//forEach()方法是Stream接口的一个默认方法,用于对集合中的每个元素执行给定的操作。该方法是序列化的,即依次处理每个元素。
//parallelStream().forEach()方法也是Stream接口的方法,但是它启用了并行处理(多线程)来加快处理速度。它将集合分成多个部分,并使用多个线程同时处理每个部分中的元素。
//parallelStream().forEach()可能会导致冲突。forEach() 方法本身是无状态的操作,可以安全地并行处理集合中的元素。然而,在使用 parallelStream().forEach() 时,需要小心并发访问共享资源,因为 forEach() 的执行是并行的,多个线程可能同时访问共享资源。如果对共享资源进行修改或者有其他线程可能修改它,就可能导致冲突或者不确定的结果。
//需要注意的是,使用并行流进行操作可以提高处理速度,但不一定在所有情况下都比串行流(forEach)更快。并行操作可能增加了线程间的同步和调度开销,并且在某些情况下可能导致结果的无序性。