Saya mencoba untuk lebih mengenal Java lambda, dapat melakukan beberapa aliran dan semacamnya tetapi masih banyak yang harus dipelajari.

Dapatkan kode sederhana ini menggunakan JSONObject dan JSONArray (org.json.simple dengan perpustakaan yang tepat ini dan tidak ada yang lain karena Gson terlalu mudah: P) apakah ada cara untuk menyederhanakan kode dengan java lambda/stream? (Saya mencoba tanpa hasil)

    JSONArray jsonArray = (JSONArray) jsonObject.get("someData");

    Iterator<JSONObject> iterator = jsonArray.iterator();

    double total = 0;
    while(iterator.hasNext()) {
        JSONObject iteratedJson = iterator.next();
        // iteratedJson.get("ip") = "101.99.99.101" example values
        String ip = (String) iteratedJson.get("ip");
        // Need only first octet
        ip = ip.substring(0, ip.indexOf("."));

        if (Integer.valueOf(ip) >= 1 && Integer.valueOf(ip) <= 100) {
            // Another object inside the array object
            JSONObject locationObject = (JSONObject) iteratedJson.get("location");
            // Id is int but JSONObject don't let me parse int...
            long locationId = (Long) locationObject.get("id");

            if (locationId == 8) {
                // iteratedJson.get("amount") = "$1,999.10" example values
                Number number = NumberFormat.getCurrencyInstance(Locale.US).parse((String)iteratedJson.get("amount"));

                // Don't need a lot of precission
                total = total + number.doubleValue();
            }
        }
    }
1
Dr3ko 15 Maret 2020, 09:26

1 menjawab

Jawaban Terbaik

Anda dapat melakukan seperti ini:

Pertama-tama untuk mengekstrak data dari JsonObject Saya telah membuat kelas. kelas ini mengambil JosonObject sebagai argumen dan mengekstrak nilainya seperti di bawah ini.

class ExtractData {
  Integer ip;
  long id;
  double amount;

  public ExtractData(JSONObject jsonObject) {
    this.ip = Integer.valueOf(jsonObject.get("ip").toString().split("\\.")[0]);
    this.id = Long.parseLong(((JSONObject) jsonObject.get("location")).get("id").toString());
    try {
         this.amount = NumberFormat.getCurrencyInstance(Locale.US)
                            .parse((String) jsonObject.get("amount")).doubleValue();
    } catch (ParseException e) {
           this.amount = 0d;
    }
  }

   // getter&setter
} 

Maka Anda dapat menggunakan stream API untuk menghitung jumlah properti jumlah.

jsonArray.stream()
         .map(obj -> new ExtractData((JSONObject) obj))
         .filter(predicate)
         .mapToDouble(value -> ((ExtractData) value).getAmount())
         .sum();

Untuk menyederhanakan saya telah mengekstrak operasi filter.

Predicate<ExtractData> predicate = extractData -> 
           extractData.getIp()>=1 && extractData.getIp()<=100 && extractData.getId() == 8;
3
Hadi J 15 Maret 2020, 09:33