我试图将一个对象数组映射到具有不同类型对象的另一个数组,我曾经在Java 8中使用流来做到这一点,这很简单,实例化一个对象设置其值并返回该对象。我刚切换到Kotlin,实际上有时候做这种操作更令人困惑。我发现的所有示例都非常简单,找不到我想要的东西。
我有这个BalanceMap类:
data class BalanceMap @JsonCreator constructor(
var balType: String,
var value: Any
)
我正在从Web服务获取数据。
val balances: List<AcctBal> = res.getAcctBals();
Run Code Online (Sandbox Code Playgroud)
AcctBal类如下所示
public class AcctBal {
@SerializedName("CurAmt")
@Expose
private CurAmt curAmt;
@SerializedName("Desc")
@Expose
private String desc;
@SerializedName("ExpDt")
@Expose
private LocalDateTime expDt;
}
Run Code Online (Sandbox Code Playgroud)
并尝试将该响应映射到 var balanceList: List<BalanceMap>
balances.map {}
Run Code Online (Sandbox Code Playgroud)
-> var balanceList: List<BalanceMap> = balances.map { t -> fun AcctBal.toBalanceMap() = BalanceMap(
balType = "",
value = ""
)}
我想做这样的事情:
List<ProductDetail> details = acctBal.stream().filter(f -> f.getBalType() != null).map(e -> {
String …Run Code Online (Sandbox Code Playgroud) 我有两个地图,我需要检查两者是否具有相同的键和相同的键数,并返回一个布尔值。我想为此使用流,我得到的是通过创建另一个列表
mapA
.entrySet()
.stream()
.filter(entry -> mapB.containsKey(entry.getKey()))
.collect(
Collectors.toMap(Entry::getKey, Entry::getValue));
Run Code Online (Sandbox Code Playgroud)
但是我的问题是,我可以在一行中执行此操作吗?它不会创建另一个列表,但是会返回一个布尔值,无论它们是否相同。
我已经将常规的for循环代码转换为java 8流。我尝试了一些,但是我仍然在学习并且用尽了所有想法,请提出想法。可以进一步简化吗?除了使用forEach之外,我无法进行太多更改。另外,为什么我必须将eid转换为getERecordFromId((String)eid)中的String
Stream <String>eIdsStream = getEidStream();
final HashSet<String> declinedRecords = new HashSet<>();
eIdsStream.forEach (eid -> {
ERecord eRecord = getERecordFromId((String)eid);
if(eRecord.getEHash() != null && Status.DECLINED == eRecord.getStatus()) {
declineRecords.add(eRecord.getEHash());
}
}
Run Code Online (Sandbox Code Playgroud) 我有这张地图:
Map<String, Map<String, String>> listMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
我想Keys从Mapmain中选择所有与之不同的值Map:listMap.value.key
List<String> distinct = listMap.entrySet().stream()
.map(e -> e.getValue()) //Map<String, String>
//Select key of value
.distinct().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我不知道如何选择key的value的listMap。
我有 3 个列表,List<List<List<Product>>我想将它们合并为一个。我已经阅读了几篇 SO 文章,但我仍然不确定如何继续。到目前为止我有
allProducts.stream()
.flatMap(List::Stream)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但这只会合并两个列表,对吗?在该语句中合并所有三个的最佳方法是什么?我见过reduce()用过,但我不知道怎么写。我需要获得Product.
我有 2 个列表,比方说
1 -> List<Employee> list1;
2 -> List<Age> list2
class Employee {
String name;
String age;
String address;
}
class Age {
String name;
String age;
}
Run Code Online (Sandbox Code Playgroud)
我喜欢做的是我需要更换的年龄在所有记录员工列表随着年龄的年龄列表具有相同名称的两个。我如何在 Java 8 中实现这一目标?
我有以下代码:
private List<CategoryModel> getReserveStockRuleMaxPriorityNavigationCategoryModel (Collection<CategoryModel> categoryModels){
return categoryModels.stream()
.map(NavigationCategoryModel.class::cast)
.sorted(Comparator.comparing(NavigationCategoryModel::getReserveStockRuleSetCategoryPriority, Comparator.nullsLast(Comparator.reverseOrder())))
.sorted(Comparator.comparing(navigationCategoryModel -> navigationCategoryModel.getReserveStockRuleSet().getCode(),Comparator.nullsLast(Comparator.naturalOrder())))
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我的目标是进行两种排序,第一种是根据reserveStockRuleSetCategoryPriority INT 反向排序,然后将具有reserveStock.code 属性为null 的NavigationCategoryModel 放在列表的末尾。
但是,我收到了 NPE,因为在此类别列表中,我可以接收 NavigationCategoryModels,其属性 ReserveStockRuleSet 为 null 。
我不想过滤和排除排序中为空的那些,因为我想将它们放在列表的末尾
一个示例输入是:
NavCatModel priority : 500 , null reserveStockRuleSet
NavCatModel priority : 100 , NOT NULL reserveStockRuleSet
NavCatModel priority : 300 , null reserveStockRuleSet
NavCatModel priority : 200 , NOT NULL reserveStockRuleSet
Run Code Online (Sandbox Code Playgroud)
两种排序后的预期结果:
NavCatModel priority : 200 , NOT NULL reserveStockRuleSet
NavCatModel priority : 100 , NOT NULL reserveStockRuleSet
NavCatModel priority …Run Code Online (Sandbox Code Playgroud) 我需要在每次出现特定元素之前添加一个元素。我可以使用 for 循环执行此操作并计算索引,然后添加元素。有没有不使用 for 循环或使用流的有效方法。
例如:在每次出现 2 之前int[] a = {1,2,4,5,7,9,2,5}
添加元素{3},导致{1,3,2,4,5,7,9,3,2,5}
试图:
int[] a = {1, 2, 4, 5, 7, 9, 2, 5};
int[] new1 = null;
int[] indexToAdd = IntStream.range(0, a.length)
.filter(i -> a[i] == 2)
.map(i -> i)
.toArray();
for(int j = 0; j<indexToAdd.length; j++){
final Integer innerj = new Integer(j);
new1 = IntStream.range(0,a.length)
.map(i -> {
if (i < indexToAdd[innerj]) {
return a[i];
} else if (i == indexToAdd[innerj]) {
return 3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试从函数返回结果并提取它的返回值。我正在使用i32and a&str并且在语句中收到不匹配类型错误match(不能在匹配中使用两种不同的类型)。我该如何解决?
fn use_result(par: i32)-> Result<i32, &'static str> {
if par == 0 {
Err("some error")
} else {
println!("par is 1");
Ok(par)
}
}
fn main() {
// Result
let res = match use_result(1) {
Ok(v) => v,
Err(e) => e,
};
}
//Do something with res: v or res: e
Run Code Online (Sandbox Code Playgroud)
}
用java 8 stream()重写这个迭代的最佳方法是什么.
for (name : names){
if(name == a){
doSomething();
break;
}
if(name == b){
doSomethingElse();
break;
}
if(name == c){
doSomethingElseElse();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果满足其中任何条件,则在3个条件下迭代列表,想要打破循环,并且在每个条件中都想调用不同的方法.
java-stream ×9
java ×8
java-8 ×5
lambda ×5
arrays ×1
comparator ×1
kotlin ×1
loops ×1
performance ×1
rust ×1
sorting ×1