使用 Java 集合和流拆分逗号分隔列表
Splitting comma separated list using Java Collections and Streams
我正在使用字符串初始化一些数据,如下所示:
private String foods = "burgers:10,apples:20,soda:25"
...作为单个字符串传递到此方法中,如下所示:
public Map<String, String> getFoods() {
return getCommaSeperatedFoodsMap(foods);
}
...调用此方法将数据拆分为相应的 key/values:
public Map<String, String> getCommaSeperatedFoodsMap(String foods) {
if (foods.isEmpty()) {
return Maps.newHashMap();
}
Map<String, String> allFoods = Arrays.stream(foods.split(","))
.map(s -> s.split(":"))
.collect(Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()));
logger.info("Foods are:" + allFoods);
return allFoods;
}
然后我可以使用它来迭代每个映射条目并将拆分字符串作为单独的参数传递给另一个方法:
public void createFoods() {
vehicle.getFoods().forEach(this::createFoodData);
}
public void createFoodData(String foodType, String price) {
//....use data in this method
我的问题是,我希望能够传递一个字符串并按如下所示按 ,
分隔符拆分 4 个值:
private String foods = "1:burgers:10:new,2:apples:20:old,3:soda:25:new"
...因此我需要拆分 4 个 :
分隔值并将它们作为字符串参数像以前一样传递给 createFoodData(String number, String foodType, String price, String age)
然后将采用 4 个参数,例如
iteration 1: '1', 'burgers', '10', 'new'
iteration 2: '2', 'apples', '20', 'old'
etc...
我应该使用哪个集合/接口来实现这个?我离开 Java 有一段时间了,需要一些提示。
应创建包含四个字段的 class FoodData
(例如,使用 Lombok 的 @Data
和 @AllArgsConstructor
注释):
@Data
@AllArgsConstructor
class FoodData {
private String
number,
foodType,
price,
age;
public FoodData(String ... arr) {
this(arr[0], arr[1], arr[2], arr[3]);
}
}
然后方法 getFoods()
可以重构为立即 return FoodData
的列表,而无需迭代映射并调用 createFoodData
:
public List<FoodData> getFoodData(String foods) {
return Arrays.stream(foods.split("\s*,\s*")) // Stream<String>
.map(row -> row.split(":")) // Stream<String[]>
.map(FoodData::new) // Stream<FoodData>
.collect(Collectors.toList());
}
我正在使用字符串初始化一些数据,如下所示:
private String foods = "burgers:10,apples:20,soda:25"
...作为单个字符串传递到此方法中,如下所示:
public Map<String, String> getFoods() {
return getCommaSeperatedFoodsMap(foods);
}
...调用此方法将数据拆分为相应的 key/values:
public Map<String, String> getCommaSeperatedFoodsMap(String foods) {
if (foods.isEmpty()) {
return Maps.newHashMap();
}
Map<String, String> allFoods = Arrays.stream(foods.split(","))
.map(s -> s.split(":"))
.collect(Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()));
logger.info("Foods are:" + allFoods);
return allFoods;
}
然后我可以使用它来迭代每个映射条目并将拆分字符串作为单独的参数传递给另一个方法:
public void createFoods() {
vehicle.getFoods().forEach(this::createFoodData);
}
public void createFoodData(String foodType, String price) {
//....use data in this method
我的问题是,我希望能够传递一个字符串并按如下所示按 ,
分隔符拆分 4 个值:
private String foods = "1:burgers:10:new,2:apples:20:old,3:soda:25:new"
...因此我需要拆分 4 个 :
分隔值并将它们作为字符串参数像以前一样传递给 createFoodData(String number, String foodType, String price, String age)
然后将采用 4 个参数,例如
iteration 1: '1', 'burgers', '10', 'new'
iteration 2: '2', 'apples', '20', 'old'
etc...
我应该使用哪个集合/接口来实现这个?我离开 Java 有一段时间了,需要一些提示。
应创建包含四个字段的 class FoodData
(例如,使用 Lombok 的 @Data
和 @AllArgsConstructor
注释):
@Data
@AllArgsConstructor
class FoodData {
private String
number,
foodType,
price,
age;
public FoodData(String ... arr) {
this(arr[0], arr[1], arr[2], arr[3]);
}
}
然后方法 getFoods()
可以重构为立即 return FoodData
的列表,而无需迭代映射并调用 createFoodData
:
public List<FoodData> getFoodData(String foods) {
return Arrays.stream(foods.split("\s*,\s*")) // Stream<String>
.map(row -> row.split(":")) // Stream<String[]>
.map(FoodData::new) // Stream<FoodData>
.collect(Collectors.toList());
}