仅当传入的用户对象不存在于数据库中时才尝试保留用户。该服务通过调用用户存储库中的 findByEmail 方法返回一个Optional。就我而言,数据库中已经存在一个确切的用户,并且对象已正确返回。
但是,在我的控制器中,当我执行Optional.map(user).orElse(persistuser)时,会执行orElse部分。
我的理解是,当Optional.map返回Optional并且用户也存在时,那么orElse应该返回用户,而不是执行persistuser操作。
请帮我解决这个问题。
控制器:
@PostMapping(path = "/addUser", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Response> addUser(@RequestBody User user){
user = userService.checkIfUserExsits(user.getEmail())
.map(usr -> usr)
.orElse(userService.persistUser(user));
return respHelpers.prepareSuccessResponse(user,"Processed");
}
Run Code Online (Sandbox Code Playgroud)
服务:
public Optional<User> checkIfUserExsits(String email){
Optional<User> user = Optional.ofNullable(userRepo.findByEmail(email));
return user;
}
Run Code Online (Sandbox Code Playgroud)
存储库:
@Repository
public interface UserRepo extends JpaRepository<User, UUID> {
public User findByEmail(String email);
}
Run Code Online (Sandbox Code Playgroud) 我想使用 java 8 将给定的二维数组转换为映射。输入 - { { 1, 0 }, { 2, 0 }, { 3, 1 }, { 3, 2 } } 输出的形式应为 Map<Integer,列表>映射=新的HashMap<>(); 输出 - {1=[0], 2=[0], 3=[1, 2]}
下面是我的解决方案
for (int[] prereq : prerequisites) {
map.computeIfAbsent(prereq[0], k -> new ArrayList<>()).add(prereq[1]);
}
Run Code Online (Sandbox Code Playgroud)
任何更好的方法,如果 for 循环可以用流代替。
我正在处理 POJO 的 spring 和 spring 验证。
在 POJO 内部,我有一些字段,其值将映射到特定ENUM类。
正如下面的代码中提到的,我的 cardType 字段为CardType ENUM.
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Max;
@Data
@SuperBuilder(toBuilder = true)
@RequiredArgsConstructor
@EqualsAndHashCode
class SamplePOJO {
private String cardType;
@Length(max = 20)
private String name;
@Max(10)
private int number
}
public enum CardType {
VISA, MASTER;
}
Run Code Online (Sandbox Code Playgroud)
对于姓名和号码我可以做@Max and @Length。我如何对属于提到的cardType应用验证enum。同样在将来,我可能List 还需要检查值。所以如果有人可以指导我。
我想将日期转换为不同格式的字符串,但出现以下错误,
DateTimeException-Field DayOfYear cannot be printed as the value 234 exceeds the maximum print width of 2
Run Code Online (Sandbox Code Playgroud)
下面是不同的格式,
"MMDDYY"
"DD_MM_YY"
"YYYYMMDD"
"MMDD"
"DD-MM-YY"
Run Code Online (Sandbox Code Playgroud)
下面是我的代码,
LocalDate localDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("DD-MM-YY");
String formattToString = localDate.format(formatter);
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我正在学习Java8,想要使用Java8中的流API执行以下操作。
输入: (1,2,3,4,5,6,7,8,9) 列表
我可以在传统java中的单个for循环中执行此操作,例如
List<Integer> ints = Arrays.asList(3,4,2,5,6,7,4,5);
List<Integer> oddList = new ArrayList<>();
List<Integer> evenList = new ArrayList<>();
for (Integer i : ints) {
if (i % 2 == 0) {
evenList.add(i);
} else {
oddList.add(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道一种以 Java8 风格执行此操作的方法,如下所示 -
List<Integer> evens = ints.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
List<Integer> odds = ints.stream().filter(i -> i % 2 == 1).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但这里的问题是我迭代了两次而不是一次整数。有没有一种方法可以做到这一点而无需在流中迭代两次?
我有一个Spring Boot Controller-
@RestController
public class UserController {
@PostMapping
@ResponseStatus(CREATED)
public UserResponse register( @Valid @RequestBody UserRequest userRequest) {
//return ....
}
}
Run Code Online (Sandbox Code Playgroud)
下面是UserRequest.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserRequest {
private String email;
//other property
}
Run Code Online (Sandbox Code Playgroud)
我在请求正文中发送以下 json -
{
"email" : "TEST@Example.com",
//some other fields.
}
Run Code Online (Sandbox Code Playgroud)
有时客户端email以大写或驼峰形式发送,因此userRquest我想将email字段的值更改为小写,就像test@example.com反序列化为UserRequest对象时一样。
有没有什么简单的方法可以做到这一点。我可以介绍我自己的注释annotation吗,比如@ToLowerCase如何创建自己的注释并在UserRequest.
我正在尝试将 ISO 8601 日期解析为 Date 对象,但我不能。
我正在尝试以下操作:
String date = "2021-05-14T09:26:20";
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
Date newDate = parser.parse(date);
System.out.println(format.format(newDate));
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
Exception in thread "main" java.text.ParseException: Unparseable date: "2021-05-14T09:26:20"
at java.text.DateFormat.parse(DateFormat.java:366)
at com.pruebas.pruebas.fechas.main(fechas.java:14)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我正在尝试将迭代 ArrayList 的普通 for 循环转换为并行循环。我遇到了parallelStream.forEach() 和parallelStream().collect(Collectors.toList()) 的概念。但不清楚如何转换。下面是普通 for 循环的示例代码:
public List<FinPlan> getFinPlanList() {
List<FinPlan> newList = new ArrayList<>();
// get list of string
List<String> finPlanIdsList = finPlanSearchRequest.getFinPlanIds();
// iterate list and add element to new list
for(String planId: finPlanIdsList) {
newList.add(retrieveFinPlan(planId));
}
return newList;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下代码,但它给了我错误“newList 应该是最终的”。
finPlanIdsList.parallelStream().forEach( planId -> {
newList.add(retrieveFinPlan(planId));
});
Run Code Online (Sandbox Code Playgroud)
那么,主要问题是如何将上面的普通循环转换为parallelStream.forEach()和parallelStream().collect()?
在Java中,如何使用列表中的列表来映射和获取类成员列表。
public class CustomerSales {
public List<Product> productList;
....
}
public class Product {
public List<ProductSubItem> productSubItemList
....
}
public class ProductSubItem {
public String itemName;
Run Code Online (Sandbox Code Playgroud)
试图:
然而,这并没有得到itemName。我正在寻找一种干净有效的方法,理想情况下可能想尝试 4-5 级深度,但为了简单起见,问题只有 3 级,等等
List<String> itemNameList = customerSales.productList.stream()
.map(p -> p.productSubItemList())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我正在使用 Java 8。
尝试使用此资源:仍然不走运,如何使用 Java 8 Stream 从某些类属性中获取列表?
java-8 ×10
java ×7
java-stream ×4
spring-boot ×2
datetime ×1
jackson ×1
lambda ×1
list ×1
option-type ×1
spring ×1
validation ×1