在java8中使用流区分质数与非质数详解

我就废话不多说了,大家还是直接看代码吧~

public class PrimeTest {

  public static void main(String[] args) {
    Map<Boolean, List<Integer>> collect = IntStream.rangeClosed(2, 100).boxed().collect(partitioningBy(PrimeTest::isPrime));

    System.out.println(collect.get(true));
    System.out.println(collect.get(false));

  }

  private static boolean isPrime(int endNum) {
    // 一个优化就是仅测试小于等于待测数平方根的因子
    int sqrt = (int)Math.sqrt(endNum);

    // 如果待测数字不能被流中任何数字整除则返回true
    return IntStream.rangeClosed(2, sqrt).noneMatch(e -> endNum % e == 0);

  }
}

补充知识:Java 求1-100以内的所有素数,判断一个数是不是素数。Java代码实现附测试结果图

质数(prime number)又称素数,有无限个。

质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。

小师弟问了我个这么个联系题,虽然看似简单,但是,大家都觉得简单的东西,没必要分享的话,那初学者,不是很痛苦吗?

所以,我就给小师弟示范了一下。方便初学者,看看怎么写代码。

代码内部的细节(都是针对没开始工作,或者刚刚工作的哥们):

1,模块化思想。

先拆分需求,本来让你求1-100以内的素数,你不能上来就干,先拆分先考虑怎么确定一个数是不是素数,然后再复用到所有。

不能把方法堆到一起,不然怎么复用代码。

2,注意注释。

就算是自己的测试代码,你好歹也写个注释,这样即使过了三个月,再看代码,也是分分钟就能明白。不要觉得简单,就懒得注释

就算参数的注释省略了,但是你这个方法的作用还是得说明一下。

好像听说过:

写的好的代码,三个月后,回头看,还能看懂,还知道是自己写的,而不是,哇,这是我写的代码吗!!!!

3,注意参数命名。

从类名到方法名,再到变量名,都不能随意取名,叫个a,b,c,d,啥的,太随意了,老师讲课这么干,为了省事,少敲几下键盘。

但是,新手们,还是从最基础的地方做起吧,这样你出来到项目上,就不会取一些笑掉大牙的命名啦。

关于这个命名,不要嫌弃他长,重点是意思清楚明白。见名知意。是最好的。

4,代码格式化。

一些新人,包括老师,以及一些工作了些年的从业人员,他们可能就没有这个格式化代码的习惯。

只要你养成习惯了,这个就不用别人说,你自己写完就会format一下的。而且,这么一整,你的代码看着也是干净整洁。

看着就舒爽。

下面看代码吧:

package com.lxk.test;

import java.util.ArrayList;
import java.util.List;

/**
 * 求1-100的素数测试
 * <p>
 * Created by lxk on 2017/3/2
 */
public class PrimeNumberTest {
  public static void main(String[] args) {
    int n = 100;
    System.out.println(getPrimeNumberToN(n));
  }

  /**
   * 得到1到n之间的素数,存到一个ArrayList集合
   */
  private static List<Integer> getPrimeNumberToN(int n) {
    List<Integer> result = new ArrayList<>();
    for (int i = 1; i < n + 1; i++) {
      if (numberIsPrime(i)) {
        result.add(i);
      }
    }
    return result;
  }

  /**
   * 判断一个数是不是素数:只能被1和本身整除
   * <p>
   * 说明:从2开始除,不需要到n,也就是循环条件是 < n 就可以,这之间只要被整除了,那么他就不是素数了
   */
  private static boolean numberIsPrime(int n) {
    for (int i = 2; i < n; i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}

执行结果图:

一道小小的题目,湿胸我总结这么多,是不是太啰嗦了。

当然了,这都是一些些小的建议。

不积跬步,无以至千里啊。百层高台起于垒土的嘛。这道理都简单,但是实现却不易。

以上这篇在java8中使用流区分质数与非质数详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java8 Stream API 详细使用方法与操作技巧指南

    本文实例讲述了Java8 Stream API 详细使用方法与操作技巧.分享给大家供大家参考,具体如下: 1. 概述 Java 8 引入的一个重要的特性无疑是 Stream API.Stream 翻译过来是"流",突然想到的是大数据处理有个流式计算的概念,数据通过管道经过一个个处理器(Handler)进行筛选,聚合,而且流都具有向量性,强调的是对数据的计算处理,而集合强调的是数据集.Stream可以看做是一个可操作的数据集序列,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.

  • Java求质数的几种常用算法分析

    本文实例讲述了Java求质数的几种常用算法.分享给大家供大家参考,具体如下: 1.根据质数的定义求 质数定义:只能被1或者自身整除的自然数(不包括1),称为质数. 利用它的定义可以循环判断该数除以比它小的每个自然数(大于1),如果有能被它整除的,则它就不是质数. 对应代码是: void printPrime(int n){//判断n是否是质数 boolean isPrime=true;//是否是质数的标志 for(int i=n-1;i>1;i-){//n除以每个比n小比1大的自然数 if(n%

  • java8使用Stream API方法总结

    Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询. Stream 的三个操作步骤 1.创建Stream. 得到Stream流的第一种方式: 可以通过Collection系列集合提供提供的Stream()或parallelStream @Test public void test1() { //可以通过Collection系列集合提供提供的

  • 在java8中使用流区分质数与非质数详解

    我就废话不多说了,大家还是直接看代码吧~ public class PrimeTest { public static void main(String[] args) { Map<Boolean, List<Integer>> collect = IntStream.rangeClosed(2, 100).boxed().collect(partitioningBy(PrimeTest::isPrime)); System.out.println(collect.get(true

  • Java8中如何通过方法引用获取属性名详解

    前言 在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点. 1.编码效率低:因为要硬编码写属性名,很可能写错,需要非常小心,时间浪费在了不必要的检查上. 2.容易让开发人员踩坑:例如有一天发现实体类中Field Name定义的不够明确,希望换一个Field Name,那么代码所有硬编码的Field Name都要跟着变更,对于未并更的地方,是无法在编译期发现的

  • Java8中Stream流式操作指南之入门篇

    目录 简介 正文 1. 流是什么 2. 老板,上栗子 3. 流的操作步骤 4. 流的特点 5. 流式操作和集合操作的区别: 总结 简介 流式操作也叫做函数式操作,是Java8新出的功能 流式操作主要用来处理数据(比如集合),就像泛型也大多用在集合中一样(看来集合这个小东西还是很关键的啊,哪哪都有它) 下面我们主要用例子来介绍下,流的基操(建议先看下lambda表达式篇,里面介绍的lambda表达式.函数式接口.方法引用等,下面会用到) 正文 1. 流是什么 流是一种以声明性的方式来处理数据的AP

  • C# 从 UTF-8 流中读取字符串的正确方法及代码详解

     我们下面的代码是从一个流 stream 中读取 UTF-8 编码的字符串.我们可以先考虑一下其中存在的潜在问题. string ReadString(Stream stream) { var sb = new StringBuilder(); var buffer = new byte[4096]; int readCount; while ((readCount = stream.Read(buffer)) > 0) { var s = Encoding.UTF8.GetString(buf

  • ASP.NET MVC中使用jQuery时的浏览器缓存问题详解

    介绍 尽管jQuery在浏览器ajax调用的时候对缓存提供了很好的支持,还是有必要了解一下如何高效地使用http协议. 首先要做的事情是在服务器端支持HTTP GET,定义不同的URL输出不同的数据(MVC里对应的就是action).如果要使用同一个地址获取不同的数据,那就不对了,一个HTTP POST也不行因为POST不能被缓存.许多开发人员使用POST主要有2个原因:明确了数据不能被缓存,或者是避免JSON攻击(JSON返回数组的时候可以被入侵). 缓存解释 jQuery全局对象里的ajax

  • Javaweb应用使用限流处理大量的并发请求详解

    在web应用中,同一时间有大量的客户端请求同时发送到服务器,例如抢购.秒杀等.这个时候如何避免将大量的请求同时发送到业务系统. 第一种方法:在容器中配置最大请求数,如果大于改请求数,则客户端阻塞.该方法有效的阻止了大量的请求同时访问业务系统,但对用户不友好. 第二种方法:使用过滤器,保证一定数量的请求能够正常访问系统,多余的请求先跳转到排队页面,由排队页面定时发起请求.过滤器实现如下: public class ServiceFilter implements Filter { private

  • JS中获取 DOM 元素的绝对位置实例详解

    在操作页面滚动和动画时经常会获取 DOM 元素的绝对位置,例如 本文 左侧的悬浮导航,当页面滚动到它以前会正常地渲染到文档流中,当页面滚动超过了它的位置,就会始终悬浮在左侧. 本文会详述各种获取 DOM 元素绝对位置 的方法以及对应的兼容性.关于如何获取 DOM 元素高度和滚动高度,请参考视口的宽高与滚动高度 一文. 概述 这些是本文涉及的 API 对应的文档和标准,供查阅: API 用途 文档 标准 offsetTop 相对定位容器的位置 MDN CSSOM View Module clien

  • 在vue项目中优雅的使用SVG的方法实例详解

    1.基础介绍 本文旨在介绍如何在项目中配置和方便的使用svg图标. 本文以vue项目为例,当然在react中的使用原理基本相似. svg图标可以直接通过img标签来使用,也可当做icon来使用. 本文是参考了鑫旭大佬的文章:SVG Sprite技术介绍. 2.配置 安装svg-sprite-loader.通过vue-cli脚手架创建的项目默认情况下会使用 url-loader 对svg进行处理,所以需要处理下: { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, l

  • C++中getline()、gets()等函数的用法详解

    在学习C++的过程中,经常会遇到输入输出的问题,以下总结一下下面几个函数的用法: 1).cin 2).cin.get() 3).cin.getline() 4).getline() 5).gets() 1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream> using namespace std; main () { int a,b; cin>>a>>b; cout<<a+b<<end

  • 在Android环境下WebView中拦截所有请求并替换URL示例详解

    需求背景 接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个xxx=1的标志位. 例如 http://www.baidu.com 加上标志位就变成了 http://www.baidu.com?xxx=1 寻找解决方案 从 Android API 11 (3.0) 开始,WebView 开始在 WebViewClient 内提供了这样一条 API ,如下: public WebResourceResponse shouldInterceptRequest(Web

随机推荐