4

以下のコードを使用しており、いくつかのロジックに応じて2つのcontinueステートメントを使用していますが、この問題を示すソナーリストReduce the total number of break and continue statements in this loop to use at most one.

この問題を解決するにはどうすればよいですか?

for (HashMap<String, String> objRequestIdVO : pObjTicketId) {
    List<TicketDetailsDO> objTicketDetailslist = storeManagerDao.getTicketDetailsWithTicketId(objRequestIdVO.get("requestId"));
    if (null == objTicketDetailslist || objTicketDetailslist.isEmpty()) {
        continue;
    }

    Integer iDesiredDsicount = objTicketDetailslist.get(0).getDesiredDiscount();
    String iSubDept = objTicketDetailslist.get(0).getSubdeptTicket().getSubDeptId();
    List<MCouponDO> objMCounponList = storeManagerDao.getMcouponData(iDesiredDsicount, iSubDept);

    if (null == objMCounponList || objMCounponList.isEmpty()) {
        continue;
    }

    String strHeader = objMCounponList.get(0).getHeader();
    objHeaderVO = new HeaderVO();
    objHeaderVO.setHeader(strHeader);
    objHeaderVO.setRequestId(objRequestIdVO.get("requestId"));
    objHeaderVOList.add(objHeaderVO);
}
4

3 に答える 3

5

null チェックの続行を null チェック以外に変更して続行します。コードは、null でないチェックに合格した場合にのみ実行されます。これは、null の場合に続行することと同じです。

for (HashMap<String, String> objRequestIdVO : pObjTicketId) {
    List<TicketDetailsDO> objTicketDetailslist = storeManagerDao.getTicketDetailsWithTicketId(objRequestIdVO.get("requestId"));
    if (!(null == objTicketDetailslist || objTicketDetailslist.isEmpty())) {
        Integer iDesiredDsicount = objTicketDetailslist.get(0).getDesiredDiscount();
        String iSubDept = objTicketDetailslist.get(0).getSubdeptTicket().getSubDeptId();
        List<MCouponDO> objMCounponList = storeManagerDao.getMcouponData(iDesiredDsicount, iSubDept);
        if (!(null == objMCounponList || objMCounponList.isEmpty()) {
            String strHeader = objMCounponList.get(0).getHeader();
            objHeaderVO = new HeaderVO();
            objHeaderVO.setHeader(strHeader);
            objHeaderVO.setRequestId(objRequestIdVO.get("requestId"));
            objHeaderVOList.add(objHeaderVO);
        }
    }
}
于 2016-06-24T05:41:39.770 に答える
1

ストリームを使用して、継続をフィルターに置き換えることができます。

pObjTicketId.stream()
                .map(m-> m.get("requestId"))
                .map(reqId ->
                        Optional.ofNullable(storeManagerDao.getTicketDetailsWithTicketId(reqId))
                        .filter(l->!l.isEmpty())
                        .map(l->l.get(0))
                        .map(ticketDetails->
                                storeManagerDao.getMcouponData(ticketDetails.getDesiredDiscount(),
                                        ticketDetails.getSubdeptTicket().getSubDeptId())
                        )
                        .filter(Objects::nonNull)
                        .filter(l->!l.isEmpty())
                        .map(l->l.get(0))
                        .map(couponDo-> {
                            HeaderVO headerVO = new HeaderVO();
                            headerVO.setHeader(couponDo.getHeader());
                            headerVO.setRequestId(oreqId);
                            return headerVO;
                        })
                )
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList());
于 2016-06-24T06:20:55.323 に答える
0

呼び出しの場合、Sonar 警告を修正するよりも大きな問題があります - storeManagerDao.getTicketDetailsWithTicketId(objRequestIdVO.get("requestId"))&storeManagerDao.getMcouponData(iDesiredDsicount, iSubDept)は DB 呼び出しを行うことに関するものです。これは大きなパフォーマンス ポイントであり、すべきです -決してループ内から DB 呼び出しを行うことはありません。これは、複数の continue & break ステートメントよりもはるかに危険です。

だから私は最初にあなたのDAO呼び出しを再構築します -あなたのメインループの外側で一度にたくさんのSQLクエリをstoreManagerDao.getTicketDetailsWithTicketId実行し、あなたの最初のものを自動的に取り除く...を生成します。INobjRequestIdVO.get("requestId")Map<String,List<TicketDetailsDO>>if

次に、このマップのキーが - のようなものであるMap<String,List<MCouponDO> objMCounponList>前のマップを反復することにより、同じプロセスを繰り返して構築します。Map<String,List<TicketDetailsDO>>iDesiredDsicount|iSubDept

このようにして、2 つの切断されたループと2 つの DB 呼び出しのみが発生し、ソナーの警告は途中で自動的に解決されます。

于 2019-05-06T05:17:33.623 に答える