【问题标题】:How can I convert a SQL Query into Lambda or Stream (Java 8)?如何将 SQL 查询转换为 Lambda 或 Stream (Java 8)?
【发布时间】:2019-10-06 08:10:23
【问题描述】:

我从 Java 开始,想将 Query 转换为 Lambda 中的 SQL 或 Java 8 中的 Stream。

按照下面的查询。

SELECT * FROM Correspondencia c, (SELECT entidadeOrigem, MAX(m1) similaridadeMaxima FROM Correspondencia WHERE m1 <> 0 GROUP BY entidadeOrigem) r WHERE c.entidadeOrigem = r.entidadeOrigem AND c.m1 = 
r.similaridadeMaxima

我用下面的 getter 和 setter 创建了 Correpondencia 类:

public class Correspondencia {

    int codigo;
    String nome;
    String entidadeOrigem;
    String EntidadeDestino;
    double m1;
    double m2;
    double m3;


double medMax;
    double dem;


    public int getCodigo() {
        return codigo;
    }
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getEntidadeOrigem() {
        return entidadeOrigem;
    }
    public void setEntidadeOrigem(String entidadeOrigem) {
        this.entidadeOrigem = entidadeOrigem;
    }
    public String getEntidadeDestino() {
        return EntidadeDestino;
    }
    public void setEntidadeDestino(String entidadeDestino) {
        EntidadeDestino = entidadeDestino;
    }
    public double getM1() {
        return m1;
    }
    public void setM1(double m1) {
        this.m1 = m1;
    }
    public double getM2() {
        return m2;
    }
    public void setM2(double m2) {
        this.m2 = m2;
    }
    public double getM3() {
        return m3;
    }
    public void setM3(double m3) {
        this.m3 = m3;
    }
    public double getMedMax() {
        return medMax;
    }
    public void setMedMax(double medMax) {
        this.medMax = medMax;
    }
    public double getDem() {
        return dem;
    }
    public void setDem(double dem) {
        this.dem = dem;
    }
}

我创建了一个列表:

List<Correspondencia> cor = new ArrayList<Correspondencia>();

cor.add(new Correspondencia(41,"Paper_Organization","Paper", "Organization",0,0.14,0.04,0.23,0.08));
cor.add(new Correspondencia(22,"Paper_Organization","Paper", "Organization",0,0.15,0.04,0.23,0.08));
cor.add(new Correspondencia(22,"Paper_Organization","Paper", "Organization",0,0.36,0.04,0.23,0.08));
cor.add(new Correspondencia(11,"email_hasanemail","email", "hasanemail",0.19,0.21,0.19,0.,0.12));
cor.add(new Correspondencia(11,"email_hasanemail","email", "hasanemail",0.25,0.21,0.19,0.,0.12));
cor.add(new Correspondencia(11,"email_hasanemail","email", "hasanemail",0.37,0.21,0.19,0.,0.12));
cor.add(new Correspondencia(31,"Review_Reviewer","Review","Reviewer",0.36,0.5,0.41,0.,0.25));
cor.add(new Correspondencia(31,"Review_Reviewer","Review","Reviewer",0.38,0.5,0.41,0.,0.25));
cor.add(new Correspondencia(31,"Review_Reviewer","Review","Reviewer",0.37,0.5,0.41,0.,0.25));
cor.add(new Correspondencia(32,"email_hasanemail","email", "hasanemail",0.36,0.5,0.41,0.,0.25));
cor.add(new Correspondencia(01,"PaperAbstract_Abstract","PaperAbstract","Abstract", 0.33,0.45,0.32,0.,0.22));
cor.add(new Correspondencia(01,"PaperAbstract_Abstract","PaperAbstract","Abstract", 0.37,0.45,0.32,0.,0.22));

现在我想根据以下查询使用 Lambda 或 Stream 过滤课程:

SELECT * FROM Correspondencia c, (SELECT entidadeOrigem, MAX(m1) similaridadeMaxima FROM Correspondencia WHERE m1 <> 0 GROUP BY entidadeOrigem) r WHERE c.entidadeOrigem = r.entidadeOrigem AND c.m1 = r.similaridadeMaxima

这将返回我作为结果 m1 按 entidadeOrigem 的项目分组的最大值:

22,"Paper_Organization","Paper", "Organization",0,0.36,0.04,0.23,0.08
11,"email_hasanemail","email", "hasanemail",0.37,0.21,0.19,0.,0.12
31,"Review_Reviewer","Review","Reviewer",0.38,0.5,0.41,0.,0.25
01,"PaperAbstract_Abstract","PaperAbstract","Abstract", 0.37,0.45,0.32,0.,0.22

一位同事给了我以下代码:

Correspondencia maxM1 = cor.stream()
            .filter(x -> x.getM1() != 0)
            .max(Comparator.comparing(x -> x.getM1()))
            .get();

        System.out.println(maxM1);

但是,它只返回 entidadeOrigem 的最大 m1 值。

而我需要的是根据下面的SQL返回由entidadeOrigem分组的m1的每个重复项的最大值。

SELECT * FROM Correspondencia c, (SELECT entidadeOrigem, MAX(m1) 
similaridadeMaxima FROM Correspondencia WHERE m1 <> 0 GROUP BY 
entidadeOrigem) r WHERE c.entidadeOrigem = r.entidadeOrigem AND c.m1 = 
r.similaridadeMaxima

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    首先根据entidadeOrigem字段分组到Map&lt;String,List&lt;Correspondencia&gt;&gt;,从每个列表中获取最大值

    List<Correspondencia> result = cor.stream()
           .collect(Collectors.groupingBy(Correspondencia::getEntidadeOrigem))
           .values()
           .stream()
           .map(c->c.stream().max(Comparator.comparingDouble(Correspondencia::getM1)))
           .filter(p->p.isPresent())
           .map(Optional::get)
           .collect(Collectors.toList());
    

    【讨论】:

    • 有问题,你在``` Paper_Organization,Paper,Organization,0.0,0.14,0.04,0.23,0.08 ```中返回最小值
    • 所以您想删除带有0.0 的记录? @RobertoMonteiro
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多