大数据第四天

特殊流程控制语句break,continue

 

break 语句

 

break语句用于终止某个语句块的执行,终止循环体

{    ……

break;

……

}

 

break 语句用法举例

public class TestBreak{

public static void main(String args[]){

for(int i = 0; i<10; i++){

if(i==3)

break;

System.out.println(" i =" + i);

}

System.out.println("Game Over!");

}

}

 

 

continue 语句

continue语句用于跳过某个循环语句块的一次执行,结束本次循环执行,进行下一次循环。

continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环

continue语句用法举例

public class ContinueTest {

public static void main(String args[]){

for (int i = 0; i < 100; i++) {

if (i%10==0)

continue;

System.out.println(i);

}

}

}

break只能用于switch语句和循环语句中。

continue 只能用于循环语句中。

二者功能类似,但continue是终止本次循环,break是终止本层循环。

break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。

方法概述

为什么使用方法?

减少重复性劳动,提高代码重用性。

比如,打印乘法口诀的代码要多次的执行,如果每次都写两个循环来实现这样的功能的话,不但代码变多,使程序的可读性变差,而且重复劳动非常多,解决的办法就是将这些经常重复使用到的代码提出来,放到一个{}中,并给这个{}起一个名字,以后再次使用到这个{}的内容时,只需要调用这个名字就可以了,这个提取重复内容的过程就是方法的定义过程,{}中的内容,就是方法的内容。

方法定义及格式

简单的说:方法就是完成特定功能的代码块{}

在很多语言里面都有函数的定义

函数在Java中被称为方法

格式:

修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) {

方法体;

return [返回值];

}

 

方法格式的解释说明

  • 修饰符

比较多,后面会详细介绍。目前可以这样记忆:被main方法直接调用的方法,定义时固定写成public static

  • 返回值类型

用于限定返回值的数据类型(可以是基本数据类型,比如:byte,short,int,long等,也可以是引用数据类型,如String,数组,对象引用等,也可以什么都不返回,特定写成void)

需不需要返回值,需要什么类型的返回值,完全取决于业务逻辑,没有统一规定

  • 方法名

一个名称,一般小写,多个单词使用驼峰命名,尽量做到见名知义

  • 参数类型 限定调用方法时传入参数的数据类型
  • 参数名

是一个变量,接收调用方法时传入的参数

参数类型和形参名合起来称为形参列表

  • 方法体

完成功能的代码,每次方法被调用,就执行一次这里面的代码

  • return

结束方法以及返回方法指定类型的值,如果方法定义时指定返回值为void,则return后不能接任何东西,此时的return可以省略

  • 返回值 程序被return带回的结果,返回给调用者

自定义方法的位置

  • 类体内
  • 不能在方法中再定义方法,或者说方法不能嵌套定义

目前由于还没有涉及到类和面向对象,所以我们自定义的类都是和main方法在同一个类中,这时要求所定义的方法的修饰符必须是public static,暂时记住即可

示例:

public static void main(String[] args){

add(1,2);//调用方法

}

public static void add(int a ,int b){

System.out.println("hello world");

return ;   //void 可以加return么??

}

总结:

  • 自定义的方法修饰符目前可以固定写成public static
  • 返回值要看具体的方法功能,可以是void,可以是基本数据类型,可以是引用数据类型
  • 方法名做到见名知义
  • 形参列表里的参数类型可以是基本数据类型和引用数据类型
  • return的含义:

用来表示一个方法的结束,并且携带返回值(如果有的话)

一旦携带返回值,一定要和方法定义的返回值类型相同或者是可以自动转换的类型,或者是子类型

自定义方法案例

如何写一个方法呢?考虑两个事情:

  • 返回值类型:明确功能结果的数据类型,没有返回值就是void,有的话,就是具体的类型
  • 参数列表:明确有几个参数,以及各个参数的类型

按照格式和需要考虑的两个事情自定义方法,来完成如下功能

定义方法求两个数据之和

1.需要返回值么?什么类型的返回值?

2.需要参数么?对什么进行操作?

代码:

class FunctionDemo {

public static void main(String[] args) {

int x = 10;

int y = 20;

//方式1:单独调用

//sum(x,y);

//方式2:输出调用

//System.out.println(sum(x,y));

//相当于System.out.println(30);

//方式3:赋值调用

int result = sum(x,y);

//result在这里可以进行操作

System.out.println(result);

}

/*

需求:求两个数据之和的案例

两个明确:

返回值类型:int

参数列表:2个,都是int类型

*/

public static int sum(int a,int b) {

//如何实现呢?

//int c = a + b;

//return c;

//c就是a+b,所以,我可以直接返回a+b

return a + b;

}

}

验证:

一个有返回值的方法是否可以单独使用?

单独使用就是单独一句调用语句,不打印,不赋值给其他变量

三元运算符不能单独使用,必须有变量接收,或者打印,或者嵌套;

有返回值的方法可以单独使用,没有变量接收编译也不报错。

总结:

可以使用带有返回值的方法的返回值,也可以不理会它的返回值。

案例:求最大值

键盘录入两个数据,返回两个数中的较大值

要求定义方法实现比较两个数的大小,并且使用三元运算符

import java.util.Scanner;

class FunctionTest {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

System.out.println("请输入第一个数据:");

int a = sc.nextInt();

System.out.println("请输入第二个数据:");

int b = sc.nextInt();

int result = getMax(a,b);

System.out.println("较大值是:"+result);

}

/*

需求:两个数中的较大值

两个明确:

返回值类型:int

参数列表:int a,int b

*/

public static int getMax(int a,int b) {

//if语句

/*

if(a > b) {

//System.out.println(a);

return a;

}else {

//System.out.println(b);

return b;

}*/

//用三元改进

//int c = ((a > b)? a: b);

//return c;

//由于c就是后面的式子

return ((a>b)? a : b);

}

}

案例:比较两个数大小

键盘录入两个数据,比较两个数是否相等,定义方法用于比较,返回布尔值

(if语句?三元运算符?能否更精简?)

 

/*

键盘录入两个数据,比较两个数是否相等

*/

import java.util.Scanner;

class FunctionTest2 {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

System.out.println("请输入第一个数据:");

int a = sc.nextInt();

System.out.println("请输入第二个数据:");

int b = sc.nextInt();

//将方法返回值赋值给一个变量,注意类型

boolean flag = compare(a,b);

System.out.println(flag);

}

/*

需求:比较两个数是否相等

两个明确:

返回值类型:boolean

参数列表:int a,int b

*/

public static boolean compare(int a,int b) {

//if语句的格式2实现

/*

if(a == b) {

return true;

}else {

return false;

}

*/

//三元改进

//boolean flag = ((a==b)? true: false);

//return flag;

//继续改进

//return ((a==b)? true: false);

//最终版

return a == b;

}

}

案例:求三个数中最大值

定义方法接收键盘录入的三个数据,返回三个数中的最大值

要求:使用三元运算符和使用if两种方式实现

/*

键盘录入三个数据,返回三个数中的最大值

*/

import java.util.Scanner;

class FunctionTest3 {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

System.out.println("请输入第一个数据:");

int a = sc.nextInt();

System.out.println("请输入第二个数据:");

int b = sc.nextInt();

System.out.println("请输入第三个数据:");

int c = sc.nextInt();

int max = getMax(a,b,c);//调用方法,将返回值赋值给一个变量

System.out.println("三个数据中的最大值是:"+max);

}

/*

需求;返回三个数中的最大值

两个明确:

返回值类型:int

参数列表:int a,int b,int c

*/

public static int getMax(int a,int b,int c) {

//if嵌套

/*

if(a > b) {

if(a > c) {

return a;

}else {

return c;

}

}else {

if(b > c) {

return b;

}else {

return c;

}

}

*/

//用三元改

/*

if(a > b) {

return (a>c? a: c);

}else {

return (b>c? b: c);

}

*/

//继续改进

//return (a>b)? (a>c? a: c): (b>c? b: c);

//不建议,写代码一定要注意阅读性强,改成如下格式

int temp = ((a>b)? a: b);

int max = ((temp>c)? temp: c);

return max;

}

}

方法定义和使用的注意事项

1.自定义的方法不调用的话,不会自动执行

2.方法与方法是平级关系,不能嵌套定义

3.方法定义的时候参数之间用逗号隔开

4.方法调用的时候不用在传递数据类型,只传值,或者是变量名即可,例如

int res = add(1,2);

//也可以直接传递常量值

int a = 1,b = 2;

int res = add(a,b);

//以下调用是错误的,调用方法时不用再把实参的类型加上

//int res = add(int a,int b);

5.如果方法有明确的返回值,一定要有return带回一个同类型值(或者可以自动向上转型的返回值),比如,有如下方法定义:

public static int test(){

short s = 12;

return s;         //s虽然是short型,但是可以自动转型成int型

}

案例:常见错误

方法定义,使用时常见的错误

1.在方法中再次定义方法(嵌套定义方法)

2.返回值类型不匹配,或者不能自动转型

3.调用方法时,在实参前多加了实参的类型

4.方法定义有返回值,但是没有在方法中加return语句

class FunctionDemo2 {

public static void main(String[] args) {

/*//不能在main方法中再定义方法

public static int sum(int a,int b){

return a + b;

}

*/

//sum(10,20);

//int x = 10;

//int y = 20;

//调用方法的时候,不能带实参的数据类型

//sum(int x,int y);

}

public static int sum(int a,int b){

return a + b;

}

}

没有明确返回值的方法的使用

没有返回值,就是返回值为void类型的方法,这样的方法的使用规范是:

不能用于赋值和打印,只能单独调用

案例:返回值为void型方法的使用

/*

需求:在控制台输出如下的形状

*****

*****

*****

*****

void类型返回值的方法调用:

只能是单独调用

不能输出调用

不能赋值调用

*/

class FunctionDemo3 {

public static void main(String[] args) {

//for循环嵌套输出图形

for(int x=0; x<4; x++) {

for(int y=0; y<5; y++) {

System.out.print("*");

}

System.out.println();

}

System.out.println("--------------");

//需求:在控制台输出一个6行7列的星形图形

for(int x=0; x<6; x++) {

for(int y=0; y<7; y++) {

System.out.print("*");

}

System.out.println();

}

System.out.println("--------------");

//如果需要继续改变,我们就应该考虑使用方法改进。

//单独调用

printXing(3,4);

System.out.println("--------------");

printXing(6,7);

System.out.println("--------------");

printXing(8,9);

//输出调用?

//由于方法没有返回值,所以不允许放到打印语句中

//System.out.println(printXing(3,4));

//赋值调用?

//没有void这种类型的变量,不用用于赋值。报错:非法的表达式开始

//void v = printXing(3,4);

}

/*

两个明确:

返回值类型:这个时候没有明确的返回值,这里记住是void

参数列表:int m,int n

*/

public static void printXing(int m,int n) {

for(int x=0; x<m; x++) {

for(int y=0; y<n; y++) {

System.out.print("*");

}

System.out.println();

}

}

}

总结:

  • void类型的方法不能放在打印语句中
  • void类型的方法不能用于赋值语句中
  • void类型的方法只能单独调用

返回值为void类型的方法练习

要求:定义一个方法,接收键盘录入行数和列数,输出由*号组成的矩形

/*

键盘录入行数和列数,输出对应的星形

*/

import java.util.Scanner;

class FunctionTest4 {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

System.out.println("请输入行数:");

int m = sc.nextInt();

System.out.println("请输入列数:");

int n = sc.nextInt();

//void类型的方法调用

printXing(m,n);

}

/*

两个明确:

返回值类型:void

参数列表:int m,int n

*/

public static void printXing(int m,int n) {

for(int x=0; x<m; x++) {

for(int y=0; y<n; y++) {

System.out.print("*");

}

System.out.println();

}

}

}

案例:n*n乘法表

定义方法,接收键盘录入一个数据n(1<=n<=9),输出对应的n*n乘法表

 

/*

键盘录入一个数据n(1<=n<=9),输出对应的nn乘法表

*/

import java.util.Scanner;

class FunctionTest5 {

public static void main(String[] args) {

//创建对象

Scanner sc = new Scanner(System.in);

System.out.println("请输入n的值:(1~9)");

int n = sc.nextInt();

//调用自定义方法

printNN(n);

}

/*

功能:输出nn乘法表

两个明确:

返回值类型:void

参数列表:int n

*/

public static void printNN(int n) {

for(int x=1; x<=n; x++) {

for(int y=1; y<=x; y++) {

System.out.print(y+"x"+x+"="+y*x+"\t");

}

System.out.println();

}

}

}

方法重载

在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表(参数个数或者参数类型)不同即可,这就叫方法的重载。

如果一个类中存在两个或者两个以上同名的方法,但是形参列表不同,他们就是方法的重载

方法重载特点

  • 与返回值类型无关,只看方法名和参数列表(形参个数,类型)
  • 在调用时,虚拟机通过参数列表的不同来区分同名方法

为什么方法的返回值不是区分两个方法重载的标志?

方法重载的例子

public static void test(){

System.out.println("这是不带参数的test方法");

}

public static int test(int id){

System.out.println("这是带一个参数的test方法");

return id;

}

//以下方法只是和上面方法返回值不同,系统无法识别成方法的重载,编译错误

public static String test(int id){

System.out.println("这是带一个参数的test方法");

return id+"";

}

 

 

案例:

定义两个同名方法,只有形参的个数不同

在使用方法时,系统会根据传递参数的个数不同而调用不同方法

/*

方法重载:

在同一个类中,方法名相同,参数列表不同。与返回值类型无关。

参数列表不同:

A:参数个数不同

B:参数类型不同

*/

class FunctionDemo4 {

public static void main(String[] args) {

//jvm会根据不同的参数去调用不同的功能

System.out.println(sum(10,20));

System.out.println(sum(10,20,30));

System.out.println(sum(10,20,30,40));

System.out.println(sum(10.5f,20f));

}

//需求1:求两个数的和

public static int sum(int a,int b) {

System.out.println("int");

return a + b;

}

//需求2:求三数的和,无需再定义sum1,含三个形参

/*

public static int sum1(int a,int b,int c) {

return a + b + c;

}

*/

public static int sum(int a,int b,int c) {

return a + b + c;

}

//需求3:求四个数的和,无需再定义sum2,含四个形参

/*

public static int sum2(int a,int b,int c,int d) {

return a + b + c + d;

}

*/

public static int sum(int a,int b,int c,int d) {

return a + b + c + d;

}

public static float sum(float a,float b) {

System.out.println("float");

return a + b;

}

}

方法重载练习:

1.定义两个方法,只有形参类型不同,数量相同

2.定义两个方法,只有形参数量不同,类型相同

3.定义两个方法,形参数量和类型都不相同

思考:一个形参是int型,一个形参是short型,编译器能准确理解我传入的参数的类型么?

有如下两个重载方法的定义:

public static void add(int a,int b){

System.out.println("int");

}

public static void add(short a,short b){

System.out.println("short");

}

使用如下方式调用,JVM将使用哪个方法呢?

public static void main(String[] args){

add(2,3);

}

是不是另一个方法永远得不到调用了?怎么才能调用?

显式调用,可以指定参数的类型:

short a = 2;

short b = 3;

add(a,b);

案例:重载方法比较两个数是否相等

比较两个数据是否相等。参数类型分别为两个byte类型,两个short类型,两个int类型,两个long类型,使用重载方法

class FunctionTest6 {

public static void main(String[] args) {

//测试

byte b1 = 3;

byte b2 = 4;

System.out.println("byte:"+compare(b1,b2));

//测试

short s1 = 5;

short s2 = 5;

System.out.println("short:"+compare(s1,s2));

//后面的两个自己测试

}

//byte类型

public static boolean compare(byte a,byte b) {

System.out.println("byte");

return a == b;

}

//short类型

public static boolean compare(short a,short b) {

System.out.println("short");

return a == b;

}

//int类型

public static boolean compare(int a,int b) {

System.out.println("int");

return a == b;

}

//long类型

public static boolean compare(long a,long b) {

System.out.println("long");

return a == b;

}

}

自定义方法之间的互相调用

之前使用的自定义方法都是被main方法调用,实际上我们自己自定义的方法之间同样可以互相调用

例如,有如下两个方法,其中一个就调用了另一个方法,这两个方法在定义的顺序上没有先后要求

public static void speak(String content) {

sayHi();             //调用另一个自定义方法

System.out.println("我想说的是: "+content);

}

public static void sayHi() {

System.out.println("Hi");

}

public static void main(String[] args) {

speak("天气不错");

}

方法的递归(了解内容)

根据方法的定义和使用规则,方法可以在同一个类中直接调用另一个方法。

但是,能不能调用这个方法自身呢?

验证:

public static void show(){

System.out.println("hello");

show();

return ;

}

一个方法体内调用它自己,就称为方法的递归,方法的递归包含了一种隐式的循环,它会循环执行某段代码,但是这种循环无须控制代码。

递归调用必须有个终止值,否则一直递归调用,直到内存溢出(StackOverflowError)。

方法递归的应用

例如:已知一个数列

f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数

求f(10)的值。

变长参数(暂时了解,后面详解)

jdk1.5之后,Java允许在形参中定义个数可变的参数,在调用方法时,可以传递不同个数的参数,定义的方式是:

在最后一个形参的类型后加上...即可,多个参数会被当成一个数组来传入(数组后面会讲)

例如:

public static void add(int i,String... args){

System.out.println(i);//打印第一个参数

//变长参数是一个数组,for循环来遍历

for(int i = 0;i<args.length;i++){

System.out.println(args[i]);

}

}

自定义方法总结:

  • 方法定义和格式

固定的public static 返回值 方法名(形参类型1 形参名1,形参类型2 形参名2...)

  • 一个没有返回值的方法只能单独调用,不能赋值,不能打印。
  • 可以使用带有返回值的方法的返回值(打印/赋值),也可以不理会它的返回值(单独调用)
  • 一个类中的同名,但是形参个数或者类型不同的多个方法称为方法的重载

返回值类型不能区别两个方法是否是方法重载

时间: 2024-08-03 11:12:52

大数据第四天的相关文章

大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

   前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分布式缓存). 一 概述 定义 MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间. 适用范围:数据量大,但是数据种类小可以放入内存. 基

大数据的四个基本特征

  大数据(big data)是指无法在可承受的时间范围内用常规软件工具进行捕捉.管理和处理的数据集合. 1. 数据量大.TB,PB,乃至EB等数据量的数据需要进行数据分析处理. 2. 要求快速响应.市场变化快,要求能及时快速的响应变化,那对数据分析也要快速,在性能上有更高要求,所以数据量显得对速度要求有些"大". 3. 数据多样性.不同的数据源,非结构化数据越来越多,需要进行清洗,整理,筛选等操作,变为结构数据. 4. 价值密度低.由于数据采集的不及时,数据样本不全面,数据可能不连续

如何在SharePoint2010中实现大数据存储(四步完成RBS解决方案)

第一步.开启数据库的FILESTREAM支持 实际环境为Sharepoint2010 和 SQL Server2008 R2:数据库默认安装的时候可能没有开启FILESTREAM,此时需要我们核实是否已经开启.打开SQL配置管理器,如下图所示 在开启FILESTREAM之后,在数据库中执行下列语句 EXEC sp_configure filestream_access_level, 2RECONFIGURE 第二.配置内容数据库与文件系统的映射 use [WSS_Content]if not e

大数据第四天作业

1.将按位运算操作,尤其是左移和右移(有无符号)整理到自己的博客中. 重点说明清晰负数的运算过程. 答:java中对于字节的移位操作按方向分为左移和右移,其中对于右移动操作又分为有符号右移和无符号右移. 1.有符号右移:将二进制向右移动 如果原来符号位为0 则新符号位也用0 否则用1; 2.无符号右移:将二进制向右移动 不管原来的符号位是0还是1 一律用0 补位; 此外对于数值的移位操作,每向右移动一位表示除二,向左移动一位表示乘二. 2.byte数到十六进制字符串表现形式程序设计原理和实现方式

大数据第四次作业

(1) addr='http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html'print(addr[-14:-5]) (2) addr1='https://docs.python.org/3/library/'addr2='turtle'addr3='.html'print(addr1+addr2+addr3) (3) for i in range(1,5): print('http://news.gzcc.cn/html/xiaoy

王家林亲传《DT大数据梦工厂》第四讲For与Function进阶实战、Lazy的使用

你想了解大数据,你想成为年薪百万吗?那你还等着什么,快点来吧!跟着王家林老师学习spark大数据 第四讲For与Function进阶实战.Lazy的使用 For循环 object For_Function_Advanced{ def  main ( args: Array[String]): Unit ={ for(i  <-  1 to 2;j <-  1 to 2)print((100*i + j) + “ ”) printIn for(i  <-  1 to 2;j <- 

大数据学习总结(8)大数据场景

大数据场景一.各种标签查询 查询要素:人.事.物.单位 查询范围:A范围.B范围.... 查询结果:pic.name.data from 1.痛点:对所有文本皆有实时查询需求2.难点:传统SQL使用WHERE子句匹配LIKE关键词,在庞大的数据字段中搜索某些想要的字,需遍历所有数据页或者索引页,查询效率底,当出现千万级以上数据时,耗时较高,无法满足实时要求3.方案:使用全文检索方案,分布式架构,即使PB级量级也可做到毫秒级查询 大数据场景二.客户事件查询 查询条件:城市.区域.时间跨度(2017

大数据学习总结(7)we should...

大数据场景一.各种标签查询 查询要素:人.事.物.单位 查询范围:A范围.B范围.... 查询结果:pic.name.data from 1.痛点:对所有文本皆有实时查询需求2.难点:传统SQL使用WHERE子句匹配LIKE关键词,在庞大的数据字段中搜索某些想要的字,需遍历所有数据页或者索引页,查询效率底,当出现千万级以上数据时,耗时较高,无法满足实时要求3.方案:使用全文检索方案,分布式架构,即使PB级量级也可做到毫秒级查询 大数据场景二.客户事件查询 查询条件:城市.区域.时间跨度(2017

大数据系列文章汇总 - 更新到15篇

转自:http://blog.csdn.net/matthewei6/article/details/50615816 大数据(一) - hadoop生态系统及版本演化大数据(二) - HDFS大数据(三) - YARN大数据(四) - MapReduce大数据(五) - HBase大数据(六) - ZooKeeper大数据(七) - Flume大数据(八) - Sqoop大数据(九) - Hive大数据(十) - Pig大数据(十一) - Mahout大数据(十二) - Oozie大数据(十三