小编Ste*_*bel的帖子

Kotlin如何在Kotlin中使用Java Streams .map()映射不同的对象响应

我试图将一个对象数组映射到具有不同类型对象的另一个数组,我曾经在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)

java-8 kotlin java-stream

1
推荐指数
1
解决办法
501
查看次数

比较两个映射的键并返回布尔值

我有两个地图,我需要检查两者是否具有相同的键和相同的键数,并返回一个布尔值。我想为此使用流,我得到的是通过创建另一个列表

mapA
.entrySet()
.stream()
.filter(entry -> mapB.containsKey(entry.getKey()))
.collect(
    Collectors.toMap(Entry::getKey, Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

但是我的问题是,我可以在一行中执行此操作吗?它不会创建另一个列表,但是会返回一个布尔值,无论它们是否相同。

java lambda java-8 java-stream

1
推荐指数
1
解决办法
63
查看次数

使用过滤器将Java for循环转换为流

我已经将常规的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)

java lambda java-stream

1
推荐指数
1
解决办法
53
查看次数

Map &lt;String,Map &lt;String,String &gt;&gt;-使用Stream选择值键

我有这张地图:

Map<String, Map<String, String>> listMap = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

我想KeysMapmain中选择所有与之不同的值MaplistMap.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)

我不知道如何选择keyvaluelistMap

java lambda java-stream

1
推荐指数
1
解决办法
41
查看次数

Java 8:将 List&lt;List&lt;List&lt;Product&gt;&gt; 合并为一个列表

我有 3 个列表,List<List<List<Product>>我想将它们合并为一个。我已经阅读了几篇 SO 文章,但我仍然不确定如何继续。到目前为止我有

allProducts.stream()
    .flatMap(List::Stream)
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这只会合并两个列表,对吗?在该语句中合并所有三个的最佳方法是什么?我见过reduce()用过,但我不知道怎么写。我需要获得Product.

java java-8 java-stream

1
推荐指数
1
解决办法
109
查看次数

如何从具有公共字段的另一个对象列表中为一个对象列表的字段设置值?

我有 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 中实现这一目标?

java java-8 java-stream

1
推荐指数
1
解决办法
1775
查看次数

Java lambda在排序时抛出NPE

我有以下代码:

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)

java sorting lambda comparator java-stream

1
推荐指数
1
解决办法
55
查看次数

在数组中的特定值之前添加元素

我需要在每次出现特定元素之前添加一个元素。我可以使用 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)

java arrays performance loops java-stream

1
推荐指数
1
解决办法
58
查看次数

使用匹配处理结果的响应

我正在尝试从函数返回结果并提取它的返回值。我正在使用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)

}

rust

1
推荐指数
1
解决办法
8434
查看次数

在java 8中使用流迭代列表

用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 lambda java-8 java-stream

0
推荐指数
2
解决办法
1486
查看次数

标签 统计

java-stream ×9

java ×8

java-8 ×5

lambda ×5

arrays ×1

comparator ×1

kotlin ×1

loops ×1

performance ×1

rust ×1

sorting ×1