diff --git a/benches/common/factories.rs b/benches/common/factories.rs
index f78ed26..f20e7bf 100644
--- a/benches/common/factories.rs
+++ b/benches/common/factories.rs
@@ -162,7 +162,7 @@
     let lines = s.lines().filter(|l| !l.is_empty());
     for (row, line) in lines.enumerate() {
         for (col, word) in line.split(' ')
-                                .filter(|s| s.len() > 0)
+                                .filter(|s| !s.is_empty())
                                 .enumerate()
         {
             let has_edge = word.parse::<i32>().unwrap();
diff --git a/benches/matrix_graph.rs b/benches/matrix_graph.rs
index 084074c..6877a89 100644
--- a/benches/matrix_graph.rs
+++ b/benches/matrix_graph.rs
@@ -30,7 +30,7 @@
         let mut g = g.clone();
 
         for &node in nodes.iter() {
-            let _ = g.add_edge(node, node, ());
+            g.add_edge(node, node, ());
         }
     });
 }
@@ -51,14 +51,14 @@
 
             edges
         })
-        .flat_map(|e| e)
+        .flatten()
         .collect();
 
     b.iter(|| {
         let mut g = g.clone();
 
         for &(source, target) in edges_to_add.iter() {
-            let _ = g.add_edge(source, target, ());
+            g.add_edge(source, target, ());
         }
     });
 }
@@ -157,7 +157,7 @@
     let lines = s.lines().filter(|l| !l.is_empty());
     for (row, line) in lines.enumerate() {
         for (col, word) in line.split(' ')
-                                .filter(|s| s.len() > 0)
+                                .filter(|s| !s.is_empty())
                                 .enumerate()
         {
             let has_edge = word.parse::<i32>().unwrap();
diff --git a/src/graph_impl/mod.rs b/src/graph_impl/mod.rs
index 74b840f..0d7a2ed 100644
--- a/src/graph_impl/mod.rs
+++ b/src/graph_impl/mod.rs
@@ -610,9 +610,7 @@
     /// endpoint in the displaced node.
     pub fn remove_node(&mut self, a: NodeIndex<Ix>) -> Option<N>
     {
-        if self.nodes.get(a.index()).is_none() {
-            return None
-        }
+        self.nodes.get(a.index())?;
         for d in &DIRECTIONS {
             let k = d.index();
 
diff --git a/src/graph_impl/stable_graph/mod.rs b/src/graph_impl/stable_graph/mod.rs
index 338a69f..3a0f90f 100644
--- a/src/graph_impl/stable_graph/mod.rs
+++ b/src/graph_impl/stable_graph/mod.rs
@@ -220,7 +220,7 @@
         self.g.edges.clear();
         // clear edges without touching the free list
         for node in &mut self.g.nodes {
-            if let Some(_) = node.weight {
+            if node.weight.is_some() {
                 node.next = [EdgeIndex::end(), EdgeIndex::end()];
             }
         }
@@ -973,7 +973,7 @@
         let mut free_node_len = 0;
         while free_node != NodeIndex::end() {
             if let Some(n) = self.g.nodes.get(free_node.index()) {
-                if let None = n.weight {
+                if n.weight.is_none() {
                     free_node = n.next[0]._into_node();
                     free_node_len += 1;
                     continue;
@@ -989,7 +989,7 @@
         let mut free_edge = self.free_edge;
         while free_edge != EdgeIndex::end() {
             if let Some(n) = self.g.edges.get(free_edge.index()) {
-                if let None = n.weight {
+                if n.weight.is_none() {
                     free_edge = n.next[0];
                     free_edge_len += 1;
                     continue;
diff --git a/tests/iso.rs b/tests/iso.rs
index 34d153c..539e81b 100644
--- a/tests/iso.rs
+++ b/tests/iso.rs
@@ -215,7 +215,7 @@
     let lines = s.lines().filter(|l| !l.is_empty());
     for (row, line) in lines.enumerate() {
         for (col, word) in line.split(' ')
-                                .filter(|s| s.len() > 0)
+                                .filter(|s| !s.is_empty())
                                 .enumerate()
         {
             let has_edge = word.parse::<i32>().unwrap();
