java utils.isobjectnotempty_java.util.List.isEmpty()检查列表本身是否为空?

本问题已经有最佳答案,请猛点这里访问。

java.util.List.isEmpty()检查列表本身是否为null,或者我是否必须自己检查?

例如:

List test = null;

if (!test.isEmpty()) {

for (String o : test) {

// do stuff here

}

}

这会抛出NullPointerException因为测试是null吗?

你可以自己回答:如果test == null应该/可以调用哪种方法?

空列表与空列表不同。

它不能。 NPE会在被调用之前被抛出。

这个("这会抛出NullPointerException因为测试为空吗?")实际上是一个非常错误的问题。 您可以通过一个非常简单的测试轻松测试这个问题。 问题本身当然需要考虑更深入地了解Java中的引用是如何工作的,为什么Java被设计为这是不可能的,但那时你应该有不同的提问。

您试图在null引用上调用isEmpty()方法(作为List test = null;)。这肯定会抛出NullPointerException。你应该改为if(test!=null)(首先检查null)。

如果ArrayList对象不包含元素,则方法isEmpty()返回true;否则为false(因为List必须首先实例化,在您的情况下是null)。

编辑:

您可能想看到这个问题。

我建议使用Apache Commons Collections

http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/CollectionUtils.html#isEmpty(java.util.Collection)

它实现了很好,并且记录良好:

/**

* Null-safe check if the specified collection is empty.

*

* Null returns true.

*

* @param coll  the collection to check, may be null

* @return true if empty or null

* @since Commons Collections 3.2

*/

public static boolean isEmpty(Collection coll) {

return (coll == null || coll.isEmpty());

}

尽管这个问题并不是特别聪明,但无论如何我还是想找到这样的答案。

Apache Utills绝对棒极了!最近我发现了SpringUtils.join - 在集合上非常有用。对不起有点offtop :)

这将抛出NullPointerException - 任何尝试在null引用上调用实例方法 - 但在这种情况下,您应该对null进行显式检查:

if ((test != null) && !test.isEmpty())

这比传播Exception要好得多,也更清晰。

对于List,我有时会使用:if(eList!= null&& eList.size()> 0)

否java.util.List.isEmpty()不检查列表是否为null。

如果您使用的是Spring框架,则可以使用CollectionUtils类来检查列表是否为空。它还负责null引用。以下是Spring framework的CollectionUtils类的代码片段。

public static boolean isEmpty(Collection< ? > collection) {

return (collection == null || collection.isEmpty());

}

即使您没有使用Spring,也可以继续调整此代码以添加到AppUtil类中。

在任何空引用上调用任何方法将始终导致异常。首先测试对象是否为null:

List test = null;

if (test != null && !test.isEmpty()) {

// ...

}

或者,编写一个方法来封装这个逻辑:

public static < T > boolean IsNullOrEmpty(Collection< T > list) {

return list == null || list.isEmpty();

}

然后你可以这样做:

List test = null;

if (!IsNullOrEmpty(test)) {

// ...

}

"java.util.List.isEmpty()检查列表本身是否为空?"对我来说似乎很清楚 - 他问的是列表的无效性,而不是它的内容。

是的,他完全把我弄糊涂了这么奇怪的问题。我的意思是,另一种方式也是愚蠢的,因为支票是if(!empty) then iterate ...但是在我看到你的答案之前我删除了我的愚蠢评论。也许他来自PHP,我们将!empty($foo)作为isset($foo) && $foo !=""的别名。

除了Lion的回答,我可以说你最好使用if(CollectionUtils.isNotEmpty(test)){...}

这也检查null,因此不需要手动检查。

是的,它会抛出异常。也许你习惯了PHP代码,其中empty($element)也检查isset($element)?在Java中,情况并非如此。

您可以轻松地记住它,因为该方法直接在列表中调用(该方法属于列表)。因此,如果没有列表,那么就没有方法。 Java会抱怨没有列表可以调用此方法。

您也可以使用自己的isEmpty(用于多个集合)方法。添加这个您的Util类。

public static boolean isEmpty(Collection... collections) {

for (Collection collection : collections) {

if (null == collection || collection.isEmpty())

return true;

}

return false;

}

也许你应该把它重命名为areEmpty()?我发现这些方法/功能更难使用,因为它们让一些东西漏掉了。此外,如果第一个Collection为空或空,其余的都不是,则会出现意外行为。

package com.chinaiatb.mrdoctor.ui.home.view; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.os.Bundle; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.blankj.utilcode.util.LogUtils; import com.chinaiatb.mrdoctor.R; import com.chinaiatb.mrdoctor.base.ui.BaseActivity; import com.chinaiatb.mrdoctor.base.ui.Header; import com.chinaiatb.mrdoctor.base.utils.FileUtils; import com.chinaiatb.mrdoctor.base.utils.ImmersedStatusBarUtil; import com.chinaiatb.mrdoctor.base.utils.NoDoubleClickUtils; import com.chinaiatb.mrdoctor.base.utils.ToastUtil; import com.chinaiatb.mrdoctor.configs.IntentParameter; import com.chinaiatb.mrdoctor.configs.ParamsConfigs; import com.chinaiatb.mrdoctor.net.NetRequestUrls; import com.chinaiatb.mrdoctor.ui.home.presenter.PCLoginPresenter; import com.chinaiatb.mrdoctor.ui.my.bean.GetSwitchResponseBean; import com.chinaiatb.mrdoctor.utils.PreferencesUtils; import com.payegis.face.Config; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale; import cn.cloudwalk.FaceInterface; import cn.payegis.authsdk.PayegisAuthSDK; import cn.payegis.authsdk.progressHUD.CwProgressHUD; import cn.payegis.authsdk.util.ImgUtil; /** * description:PC登录页 * 2020/3/17. * auth:lihe */ public class PCLoginActivity extends BaseActivity<PCLoginPresenter> implements View.OnClickListener { private ImageView iv_titlebar_back; private TextView tv_titlebar_title; private TextView tv_pc_login; private TextView tv_pc_cancel_login; private String content; private boolean canEnter = true;//标记能否进入支付页面,处理连续点击的问题 private String veriFace; @Override public void initData(Bundle savedInstanceState) { GetSwitchResponseBean switchResponseBean = PreferencesUtils.getInstance().getObject(PreferencesUtils.GET_SWITCH, GetSwitchResponseBean.class); if(null != switchResponseBean){ veriFace = switchResponseBean.getVeriFace(); } content = getIntent().getStringExtra(IntentParameter.QR_SCAN_CONTENT); //初始化认证 initAuth(); } @Override public PCLoginPresenter newP() { return new PCLoginPresenter(); } @Override public Header onCreateHeader(RelativeLayout container) { ImmersedStatusBarUtil.setDarkStatusBar(context); View view = LayoutInflater.from(this).inflate(R.layout.activity_titlebar, container, false); iv_titlebar_back = view.findViewById(R.id.iv_titlebar_back); tv_titlebar_title = view.findViewById(R.id.tv_titlebar_title); tv_titlebar_title.setText(""); iv_titlebar_back.setImageResource(R.mipmap.ic_close_pc); RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, container.getLayoutParams().height); rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); container.addView(view, rlp); Header.Builder builder = new Header.Builder(this, container); return builder.build(true); } @Override public View onCreateContentView() { View view = View.inflate(this, R.layout.activity_pc_login,null); initView(view); initOnClick(); return view; } private void initView(View view) { tv_pc_login = view.findViewById(R.id.tv_pc_login); tv_pc_cancel_login = view.findViewById(R.id.tv_pc_cancel_login); } private void initOnClick() { iv_titlebar_back.setOnClickListener(this); tv_pc_login.setOnClickListener(this); tv_pc_cancel_login.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.iv_titlebar_back: finish(); break; case R.id.tv_pc_login://登录 if(NoDoubleClickUtils.isDoubleClick()){ return; } if(!TextUtils.isEmpty(veriFace) && GetSwitchResponseBean.VERI_FACE_NEED_1.equals(veriFace) && NetRequestUrls.isHainanHost()){ if(canEnter){ canEnter = false; faceliveness(); } }else{ getP().qrLogin(content); } break; case R.id.tv_pc_cancel_login://取消登录 finish(); break; } } public void qrLoginSuccess() { ToastUtil.showShortToast("登录成功"); finish(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { canEnter = true; super.onActivityResult(requestCode, resultCode, data); if (PayegisAuthSDK.KEY_TO_DETECT_REQUEST_CODE == requestCode && resultCode == PayegisAuthSDK.LIVE_RESULT_SUCCESS_CODE) { if (processDialog != null && !processDialog.isShowing()) { processDialog.setLabel("活体检测中…"); processDialog.show(); } new Thread(new Runnable() { @Override public void run() { final Bitmap bitmap = ImgUtil.bytesToBimap(PayegisAuthSDK.bestFaceData); runOnUiThread(new Runnable() { @Override public void run() { String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(new Date()); //照片命名 String cropFileName = "byt_crop_" + timeStamp + ".jpg"; //裁剪头像的绝对路径 String path = ParamsConfigs.PICTURE_SAVE_PATH; String uploadPicPath = path + cropFileName; File pathFile = new File(path); File uploadPicFile = new File(uploadPicPath); try { if (!pathFile.exists()) { pathFile.mkdirs(); } uploadPicFile.createNewFile(); //创建文件 FileOutputStream fos = new FileOutputStream(uploadPicFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { LogUtils.w("=拍照图片保存发生异常!" + e); } String faceBase64 = FileUtils.imageToBase64(uploadPicFile); getP().faceCompareTFD(faceBase64); if (!PCLoginActivity.this.isFinishing() && processDialog != null && processDialog.isShowing()) { processDialog.dismiss(); } } }); } }).start(); return; } } /********************************************************活体认证 start*********************************************************/ private PayegisAuthSDK sdk; public CwProgressHUD processDialog; private void initAuth(){ // initSDK(); initPermission(); sdk = PayegisAuthSDK.getInstance(); Config.appName = "mrdoctor-face-android"; processDialog = CwProgressHUD.create(this).setStyle(CwProgressHUD.Style.SPIN_INDETERMINATE).setLabel(this.getString(cn.payegis.authsdk.R.string.cloudwalk_faceverifying)).setCancellable(true).setAnimationSpeed(2).setCancellable(false).setDimAmount(0.5F); } @Override public void onDestroy() { super.onDestroy(); } /** * 申请权限 */ private void initPermission() { ArrayList<String> perList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { perList.add(Manifest.permission.CAMERA); } if (perList.size() > 0) { String[] perArr = new String[perList.size()]; perList.toArray(perArr); ActivityCompat.requestPermissions(this, perArr, 100); } } /** * 开始活体检测 * */ public void faceliveness() { //获取活体检测 Intent,以随机的方式 // Intent it = sdk.createRandomLivenessIntent(this, 1); // //自定义动作顺序 // int[] liveness = {FaceLivenessTypeHelper.EYE}; // Intent it = sdk.createLivenessIntent(this, liveness); // //调用扫描页 // if (it != null) { // startActivityForResult(it, PayegisAuthSDK.KEY_TO_DETECT_REQUEST_CODE); // } ArrayList<Integer> liveList = new ArrayList<>(); liveList.add(FaceInterface.LivessType.LIVESS_EYE); sdk.startLivenessActivity(this, PayegisAuthSDK.KEY_TO_DETECT_REQUEST_CODE,liveList); } public void faceCompareSuccess() { getP().qrLogin(content); } /********************************************************活体认证 end***********************************************************/ } 这个功能模块用到了存储权限吗
最新发布
07-13
package com.example.st_mes.config; import com.alibaba.fastjson.JSONObject; import com.example.st_mes.model.*; import com.example.st_mes.model.dto.MySecurityUser; import com.example.st_mes.model.vo.RoleMenuButtonVo; import com.example.st_mes.service.ButtonService; import com.example.st_mes.service.UserRoleService; import com.example.st_mes.utils.JwtUtils; import com.example.st_mes.utils.ResponseTemplate; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Component public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Autowired private ObjectMapper objectMapper; @Autowired private JwtUtils jwtUtils; @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private ButtonService buttonService; @Autowired private UserRoleService userRoleService; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { //从认证信息里获取登录用户的信息 MySecurityUser mySecurityUser = (MySecurityUser) authentication.getPrincipal(); User userInfo = mySecurityUser.getUserData(); String strUserInfo = objectMapper.writeValueAsString(userInfo);//将用户信息转换为字符串 userRoleService.getUserRole(userInfo.getUserid()); //获取用户权限信息 List<SimpleGrantedAuthority> authorities = (List<SimpleGrantedAuthority>) mySecurityUser.getAuthorities(); List<String> authList = authorities.stream().map(SimpleGrantedAuthority::getAuthority).collect(Collectors.toList()); List<RoleButton> roleButtonList = mySecurityUser.getRoleButtonList(); Integer btnSize = roleButtonList.size(); Integer[] btn = new Integer[btnSize]; String[] permissions = new String[btnSize]; int i = 0; for (RoleButton roleButton:roleButtonList){ btn[i] = roleButton.getButtonId(); Button button = buttonService.getButtonById(btn[i]); permissions[i] = button.getCode(); i++; } //生成jwt String jwtToken = jwtUtils.createJwt(strUserInfo, authList); JSONObject jsonObject = new JSONObject(); jsonObject.put("jwtToken",jwtToken); jsonObject.put("permissions",permissions); ResponseTemplate responseTemplate = ResponseTemplate.builder() .code(200) .msg("jwt生成成功") .data(jsonObject) .build(); //将jwt存放到Redis中 stringRedisTemplate.opsForValue().set("loginToken:" + jwtToken, objectMapper.writeValueAsString(authentication),30, TimeUnit.MINUTES); printToken(request,response,responseTemplate); } private void printToken(HttpServletRequest request, HttpServletResponse response, ResponseTemplate responseTemplate)throws IOException{ String strResponse = objectMapper.writeValueAsString(responseTemplate); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.println(strResponse); writer.flush(); } } 这段代码的问题
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值